/****************************************************************************** * Copyright (c) 2002, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ****************************************************************************/ package org.eclipse.gmf.runtime.diagram.ui.render.clipboard; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.util.List; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.SWTGraphics; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.PrecisionPoint; import org.eclipse.draw2d.geometry.PrecisionRectangle; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gmf.runtime.common.ui.util.DisplayUtils; import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants; import org.eclipse.gmf.runtime.draw2d.ui.internal.graphics.ScaledGraphics; import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.graphics.GraphicsToGraphics2DAdaptor; import org.eclipse.gmf.runtime.draw2d.ui.render.internal.graphics.RenderedMapModeGraphics; import org.eclipse.gmf.runtime.draw2d.ui.render.internal.graphics.RenderedScaledGraphics; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.widgets.Display; /** * Supports generation of AWT and SWT images of a diagram or a subset of * editparts on a diagram. * * @author schafe / sshaw */ public class DiagramImageGenerator extends DiagramGenerator { /** * Creates a new instance. * @param dgrmEP * the diagram editpart */ public DiagramImageGenerator(DiagramEditPart dgrmEP) { super(dgrmEP); } private GC gc = null; private Image image = null; /* * (non-Javadoc) * * @see org.eclipse.gmf.runtime.diagram.ui.internal.clipboard.DiagramGenerator#setUpGraphics(int, * int) */ protected Graphics setUpGraphics(int width, int height) { Display display = DisplayUtils.getDisplay(); image = new Image(display, new org.eclipse.swt.graphics.Rectangle(0, 0, width, height)); gc = new GC(image); SWTGraphics swtG = new SWTGraphics(gc); swtG.setAdvanced(true); swtG.setAntialias(SWT.ON); /* IPreferenceStore preferenceStore = (IPreferenceStore) getDiagramEditPart().getDiagramPreferencesHint().getPreferenceStore(); if (preferenceStore.getBoolean(IPreferenceConstants.PREF_ENABLE_ANTIALIAS)) { swtG.setAntialias(SWT.ON); } else { swtG.setAntialias(SWT.OFF); } */ return swtG; } /* * (non-Javadoc) * * @see org.eclipse.gmf.runtime.diagram.ui.internal.clipboard.DiagramGenerator#disposeGraphics(org.eclipse.draw2d.Graphics) */ protected void disposeGraphics(Graphics g) { super.disposeGraphics(g); image.dispose(); if (gc != null) gc.dispose(); gc = null; } /* (non-Javadoc) * @see org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramGenerator#getImageDescriptor(org.eclipse.draw2d.Graphics) */ protected ImageDescriptor getImageDescriptor(Graphics g) { return new ImageDescriptor() { ImageData imgData = image.getImageData(); /* * (non-Javadoc) * * @see org.eclipse.jface.resource.ImageDescriptor#getImageData() */ public ImageData getImageData() { return imgData; } }; } /* * (non-Javadoc) * * @see org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramGenerator#createAWTImageForParts(java.util.List, * org.eclipse.swt.graphics.Rectangle) */ public java.awt.Image createAWTImageForParts(List selectedObjects, org.eclipse.swt.graphics.Rectangle sourceRect) { BufferedImage awtImage = null; IMapMode mm = getMapMode(); PrecisionRectangle rect = new PrecisionRectangle(); rect.setX(sourceRect.x); rect.setY(sourceRect.y); rect.setWidth(sourceRect.width); rect.setHeight(sourceRect.height); mm.LPtoDP(rect); awtImage = new BufferedImage((int) Math.round(rect.preciseWidth), (int) Math.rint(rect.preciseHeight), BufferedImage.TYPE_4BYTE_ABGR_PRE); Graphics2D g2d = awtImage.createGraphics(); g2d.setColor(Color.white); g2d.fillRect(0, 0, awtImage.getWidth(), awtImage.getHeight()); // Check anti-aliasing preference IPreferenceStore preferenceStore = (IPreferenceStore) getDiagramEditPart() .getDiagramPreferencesHint().getPreferenceStore(); if (preferenceStore .getBoolean(IPreferenceConstants.PREF_ENABLE_ANTIALIAS)) { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } else { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); } g2d.clip(new java.awt.Rectangle(0, 0, awtImage.getWidth(), awtImage .getHeight())); Graphics graphics = new GraphicsToGraphics2DAdaptor(g2d, new Rectangle(0, 0, awtImage.getWidth(), awtImage.getHeight())); RenderedMapModeGraphics mapModeGraphics = new RenderedMapModeGraphics( graphics, mm); renderToGraphics(mapModeGraphics, new Point(sourceRect.x, sourceRect.y), selectedObjects); graphics.dispose(); g2d.dispose(); return awtImage; } /* (non-Javadoc) * @see org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramGenerator#createConstrainedAWTImageForParts(java.util.List, int, int, boolean) */ public java.awt.Image createConstrainedAWTImageForParts(List editParts, int maxDeviceWidth, int maxDeviceHeight, boolean useMargins) { BufferedImage awtImage = null; IMapMode mm = getMapMode(); ConstrainedImageRenderingData data = getConstrainedImageRenderingData(editParts, maxDeviceWidth, maxDeviceHeight, useMargins); awtImage = new BufferedImage(data.imageWidth, data.imageHeight, BufferedImage.TYPE_4BYTE_ABGR_PRE); Graphics2D g2d = awtImage.createGraphics(); g2d.setColor(Color.white); g2d.fillRect(0, 0, awtImage.getWidth(), awtImage.getHeight()); // Check anti-aliasing preference IPreferenceStore preferenceStore = (IPreferenceStore) getDiagramEditPart() .getDiagramPreferencesHint().getPreferenceStore(); if (preferenceStore .getBoolean(IPreferenceConstants.PREF_ENABLE_ANTIALIAS)) { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } else { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); } g2d.clip(new java.awt.Rectangle(0, 0, awtImage.getWidth(), awtImage .getHeight())); Graphics graphics = new GraphicsToGraphics2DAdaptor(g2d, new org.eclipse.swt.graphics.Rectangle(0, 0, data.imageWidth, data.imageHeight)); ScaledGraphics scaledGraphics = new RenderedScaledGraphics(graphics); RenderedMapModeGraphics mapModeGraphics = new RenderedMapModeGraphics( scaledGraphics, mm); g2d.translate(data.margin, data.margin); mapModeGraphics.scale(data.scalingFactor); Point location = new PrecisionPoint(data.imageOriginalBounds.preciseX(), data.imageOriginalBounds.preciseY()); mm.DPtoLP(location); renderToGraphics(mapModeGraphics, location, editParts); graphics.dispose(); g2d.dispose(); return awtImage; } }