blob: 051accdc102e604e9f1149c45e916f6cc9fc41f0 [file] [log] [blame]
/******************************************************************************
* 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;
}
}