package examples.screencast;
import io.termd.core.tty.TtyConnection;
import io.termd.core.util.Vector;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.concurrent.TimeUnit;
/**
* Createa a screencast of the current screen to the TTY.
*
* This example shows how to push data to the TTY on regular intervals.
*/
public class Screencaster {
private final Robot robot;
private final TtyConnection conn;
private boolean interrupted;
public Screencaster(Robot robot, TtyConnection conn) {
this.robot = robot;
this.conn = conn;
conn.setEventHandler((event, key) -> interrupted = true);
}
public void handle() {
if (conn.size() != null) {
broadcast();
} else {
conn.setSizeHandler(size -> broadcast());
}
}
private void broadcast() {
if (interrupted) {
conn.close();
return;
}
BufferedImage capture = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
Vector size = conn.size();
Image temp = capture.getScaledInstance(size.x(), size.y(), Image.SCALE_SMOOTH);
BufferedImage scaled = new BufferedImage(size.x(), size.y(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = scaled.createGraphics();
g2d.drawImage(temp, 0, 0, null);
g2d.dispose();
StringBuilder sb = new StringBuilder();
for (int y = 0; y < size.y(); y++) {
sb.append("\033[").append(y + 1).append(";1H");
for (int x = 0; x < size.x(); x++) {
Color pixel = new Color(scaled.getRGB(x, y));
int r = pixel.getRed();
int g = pixel.getGreen();
int b = pixel.getBlue();
double grey = (r + g + b) / 3.0;
if (grey < 51) {
sb.append('\u2588');
} else if (grey < 102) {
sb.append('\u2593');
} else if (grey < 153) {
sb.append('\u2592');
} else if (grey < 204) {
sb.append('\u2591');
} else {
sb.append(' ');
}
}
}
conn.write(sb.toString());
conn.schedule(this::broadcast, 100, TimeUnit.MILLISECONDS);
}
}