package jp.ac.aiit.jointry.services.picture.paint.views;
import java.awt.Point;
import java.util.LinkedList;
import javafx.geometry.Point2D;
import javafx.scene.SnapshotParameters;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.PixelReader;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.paint.Color;
import jp.ac.aiit.jointry.services.picture.paint.PaintApplication;
public class PtFill extends PaintTool {
@Override
public void paint(Canvas canvas, Point2D start, Point2D end) {
SnapshotParameters params = new SnapshotParameters();
params.setFill(Color.TRANSPARENT); //透過色をそのまま取得するため
WritableImage snapshot = canvas.snapshot(params, null);
//編集のためRWを取得
PixelWriter writer = snapshot.getPixelWriter();
PixelReader reader = snapshot.getPixelReader();
Color fillColor = PaintApplication.getModel().getColor();
Color seedColor = reader.getColor((int) start.getX(), (int) start.getY());
//塗潰す色と同じであればなにもしない
if (fillColor.equals(seedColor)) return;
//塗りつぶす最大範囲
double width = canvas.getWidth();
double height = canvas.getHeight();
//塗りつぶす位置リスト
LinkedList<Point> queue = new LinkedList();
queue.add(new Point((int) start.getX(), (int) start.getY()));
while (queue.peek() != null) {
Point point = queue.poll();
//塗りつぶし対象の色ではないため
if (!reader.getColor(point.x, point.y).equals(seedColor)) continue;
writer.setColor(point.x, point.y, fillColor); //実際の塗りつぶし処理
//上下左右のdotをキューへ登録し塗潰す色を検索
if (point.x + 1 < width) queue.add(new Point(point.x + 1, point.y));
if (point.y + 1 < height) queue.add(new Point(point.x, point.y + 1));
if (point.x - 1 >= 0) queue.add(new Point(point.x - 1, point.y));
if (point.y - 1 >= 0) queue.add(new Point(point.x, point.y - 1));
}
//加工済みの画像を再描画
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.drawImage(snapshot, 0, 0);
}
}