package com.baselet.gwt.client.view; import com.baselet.control.basics.geom.Rectangle; import com.baselet.control.constants.SharedConstants; import com.baselet.diagram.draw.helper.ColorOwn; import com.baselet.diagram.draw.helper.ColorOwn.Transparency; import com.baselet.element.GridElementUtils; import com.baselet.element.interfaces.Diagram; import com.baselet.gwt.client.base.Converter; import com.google.gwt.canvas.client.Canvas; import com.google.gwt.canvas.dom.client.Context2d; public class CanvasUtils { private static final int EXPORT_BORDER = 10; public static String createPngCanvasDataUrl(Diagram diagram) { DrawCanvas pngCanvas = new DrawCanvas(); // Calculate and set canvas width Rectangle geRect = GridElementUtils.getGridElementsRectangle(diagram.getGridElements()); geRect.addBorder(EXPORT_BORDER); pngCanvas.clearAndSetSize(geRect.getWidth(), geRect.getHeight()); // Fill Canvas white pngCanvas.getContext2d().setFillStyle(Converter.convert(ColorOwn.WHITE)); pngCanvas.getContext2d().fillRect(0, 0, pngCanvas.getWidth(), pngCanvas.getHeight()); // Draw Elements on Canvas and translate their position pngCanvas.getContext2d().translate(-geRect.getX(), -geRect.getY()); pngCanvas.draw(false, diagram.getGridElementsByLayerLowestToHighest(), new SelectorNew(diagram)); // use a new selector which has nothing selected return pngCanvas.toDataUrl("image/png"); } private static Canvas gridCanvas; public static void drawGridOn(Context2d context2d) { if (gridCanvas == null) { gridCanvas = Canvas.createIfSupported(); gridCanvas.setCoordinateSpaceWidth(3000); gridCanvas.setCoordinateSpaceHeight(2000); int width = gridCanvas.getCoordinateSpaceWidth(); int height = gridCanvas.getCoordinateSpaceHeight(); Context2d backgroundContext = gridCanvas.getContext2d(); backgroundContext.setStrokeStyle(Converter.convert(ColorOwn.BLACK.transparency(Transparency.SELECTION_BACKGROUND))); for (int i = 0; i < width; i += SharedConstants.DEFAULT_GRID_SIZE) { drawLine(backgroundContext, i, 0, i, height); } for (int i = 0; i < height; i += SharedConstants.DEFAULT_GRID_SIZE) { drawLine(backgroundContext, 0, i, width, i); } } context2d.drawImage(gridCanvas.getCanvasElement(), 0, 0); } private static void drawLine(Context2d context, int x, int y, int x2, int y2) { context.beginPath(); context.moveTo(x + 0.5, y + 0.5); // +0.5 because a line of thickness 1.0 spans 50% left and 50% right (therefore it would not be on the 1 pixel - see https://developer.mozilla.org/en-US/docs/HTML/Canvas/Tutorial/Applying_styles_and_colors) context.lineTo(x2 + 0.5, y2 + 0.5); context.stroke(); } }