package com.xenoage.zong.renderer.javafx; import static com.xenoage.utils.math.geom.Point2i.origin; import com.xenoage.utils.math.Units; import com.xenoage.utils.math.geom.Size2f; import com.xenoage.zong.layout.Layout; import com.xenoage.zong.layout.Page; import com.xenoage.zong.renderer.LayoutRenderer; import com.xenoage.zong.renderer.canvas.CanvasDecoration; import com.xenoage.zong.renderer.canvas.CanvasFormat; import com.xenoage.zong.renderer.canvas.CanvasIntegrity; import com.xenoage.zong.renderer.javafx.canvas.JfxCanvas; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.WritableImage; import javafx.scene.paint.Color; /** * Like {@link LayoutRenderer}, but more JavaFx specific rendering methods. * * @author Andreas Wenger */ public class JfxLayoutRenderer { /** * Returns a {@link WritableImage} with the given page of the given {@link Layout} * which is rendered at the given zoom level. */ public static WritableImage paintToImage(Layout layout, int pageIndex, float zoom) { Page page = layout.getPages().get(pageIndex); Size2f pageSize = page.getFormat().getSize(); int width = Units.mmToPxInt(pageSize.width, zoom); int height = Units.mmToPxInt(pageSize.height, zoom); WritableImage wim = new WritableImage(width, height); Canvas jfxCanvas = new Canvas(width, height); GraphicsContext context = jfxCanvas.getGraphicsContext2D(); context.setFill(Color.WHITE); context.fillRect(0, 0, width, height); LayoutRenderer.paintToCanvas(layout, pageIndex, zoom, origin, new JfxCanvas(context, pageSize, CanvasFormat.Raster, CanvasDecoration.Interactive, CanvasIntegrity.Perfect)); jfxCanvas.snapshot(null, wim); return wim; } }