package com.xenoage.zong.renderer.gwtcanvas;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.dom.client.CanvasElement;
import com.xenoage.utils.math.Units;
import com.xenoage.utils.math.geom.Size2f;
import com.xenoage.utils.math.geom.Size2i;
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.gwtcanvas.canvas.GwtCanvas;
import static com.xenoage.utils.math.geom.Point2i.origin;
/**
* Like {@link LayoutRenderer}, but more specific rendering methods
* for a GWT HTML5 canvas.
*
* @author Andreas Wenger
*/
public class GwtCanvasLayoutRenderer {
/**
* Paints the given page of the given {@link Layout} at the given zoom level
* into the given {@link CanvasElement}, which is resized to include the whole page.
* The size in pixel is also returned.
*/
public static Size2i paintToCanvas(Layout layout, int pageIndex, float zoom,
com.google.gwt.canvas.client.Canvas canvas) {
Context2d context = canvas.getContext2d();
//compute size
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);
//resize canvas and coordinate space
canvas.setWidth(width + "px");
canvas.setHeight(height + "px");
int coordSpaceFactor = 2; //double resolution: smoother
canvas.setCoordinateSpaceWidth(width * coordSpaceFactor);
canvas.setCoordinateSpaceHeight(height * coordSpaceFactor);
context.scale(coordSpaceFactor, coordSpaceFactor);
//white page
context.setFillStyle("white");
context.fillRect(0, 0, width, height);
//paint layout
LayoutRenderer.paintToCanvas(layout, pageIndex, zoom, origin,
new GwtCanvas(context, CanvasFormat.Raster,
CanvasDecoration.Interactive, CanvasIntegrity.Perfect));
return new Size2i(width, height);
}
}