This repository has been archived on 2025-03-12. You can view files and clone it, but cannot push or open issues or pull requests.
aud-2021-h07-gruphi/src/main/java/de/oshgnacknak/gruphi/Canvas.java

97 lines
2.8 KiB
Java

package de.oshgnacknak.gruphi;
import javax.swing.*;
import java.awt.*;
import java.util.function.Consumer;
public class Canvas extends JPanel {
private final Consumer<Drawable> draw;
public Canvas(Consumer<Drawable> draw) {
this.draw = draw;
}
@Override
public void paint(Graphics graphics) {
var g = (Graphics2D) graphics;
draw.accept(new Drawable() {
@Override
public void fill(Color c) {
g.setColor(c);
}
@Override
public void strokeWeight(double w) {
g.setStroke(new BasicStroke((int) w));
}
@Override
public void rect(double x, double y, double w, double h) {
g.fillRect(round(x), round(y), round(w), round(h));
}
@Override
public void ellipse(double x, double y, double w, double h) {
g.fillOval(round(x - w/2), round(y - h/2), round(w), round(h));
}
@Override
public void triangle(double x1, double y1, double x2, double y2, double x3, double y3) {
int[] xs = {round(x1), round(x2), round(x3)};
int[] ys = {round(y1), round(y2), round(y3)};
g.fillPolygon(xs, ys, 3);
}
@Override
public void line(double x1, double y1, double x2, double y2) {
g.drawLine(round(x1), round(y1), round(x2), round(y2));
}
@Override
public void image(Image image, double x, double y, double w, double h) {
g.drawImage(image, round(x), round(y), round(w), round(h), null);
}
@Override
public void rotated(double theta, double x, double y, Runnable r) {
g.rotate(theta, x, y);
r.run();
g.rotate(-theta, x, y);
}
@Override
public void translated(double x, double y, Runnable r) {
g.translate(x, y);
r.run();
g.translate(-x, -y);
}
@Override
public void scaled(double scale, Runnable r) {
g.scale(scale, scale);
r.run();
g.scale(1/scale, 1/scale);
}
@Override
public void text(double x, double y, String text) {
FontMetrics metrics = g.getFontMetrics(g.getFont());
int d = metrics.getAscent();
g.drawString(text, round(x), round(y) + d);
}
@Override
public void textSize(int size) {
var f = g.getFont();
g.setFont(new Font(f.getName(), Font.PLAIN, size));
}
});
}
private int round(double d) {
return (int) Math.round(d);
}
}