/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.gef.image;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.SWTGraphics;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.xmind.gef.draw2d.graphics.ScaledGraphics;
public class FigureImageDescriptor extends ImageDescriptor {
public static ImageDescriptor createFromFigure(IFigure figure) {
return new FigureImageDescriptor(new IFigure[] { figure },
ImageExportUtils.createExportAreaProvider(
ImageExportUtils.getBounds(figure)));
}
public static ImageDescriptor createFromFigure(IFigure figure,
IExportAreaProvider exportAreaProvider) {
return new FigureImageDescriptor(new IFigure[] { figure },
exportAreaProvider);
}
public static ImageDescriptor createFromFigures(IFigure[] figures,
IExportAreaProvider exportAreaProvider) {
return new FigureImageDescriptor(figures, exportAreaProvider);
}
private final IFigure[] figures;
private IExportAreaProvider exportAreaProvider;
private ImageData data = null;
protected FigureImageDescriptor(IFigure[] figures,
IExportAreaProvider exportAreaProvider) {
this.figures = figures;
this.exportAreaProvider = exportAreaProvider;
}
@Override
public Image createImage(boolean returnMissingImageOnError, Device device) {
Rectangle exportArea = exportAreaProvider.getExportArea();
Image image = new Image(device, exportArea.width, exportArea.height);
double scale = exportAreaProvider.getScale();
if (scale == 0)
return image;
return render(image, returnMissingImageOnError, exportArea, scale);
}
private Image render(Image image, boolean returnMissingImageOnError,
Rectangle exportArea, double scale) {
GC gc = new GC(image);
SWTGraphics baseGraphcis = new SWTGraphics(gc);
baseGraphcis.translate(-exportArea.x, -exportArea.y);
Graphics graphics = baseGraphcis;
ScaledGraphics scaledGraphics = null;
if (scale > 0 && scale != 1) {
if (ScaledGraphics.SCALED_GRAPHICS_ENABLED) {
scaledGraphics = new ScaledGraphics(graphics);
scaledGraphics.scale(scale);
graphics = scaledGraphics;
} else {
graphics.scale(scale);
}
}
try {
graphics.pushState();
try {
for (int i = 0; i < figures.length; i++) {
IFigure figure = figures[i];
figure.paint(graphics);
graphics.restoreState();
}
} finally {
graphics.popState();
}
} catch (Throwable t) {
if (!returnMissingImageOnError) {
image.dispose();
image = null;
}
} finally {
if (scaledGraphics != null) {
scaledGraphics.dispose();
}
baseGraphcis.dispose();
gc.dispose();
}
return image;
}
@Override
public ImageData getImageData() {
if (data == null) {
Image tempImage = createImage(false);
if (tempImage != null) {
data = tempImage.getImageData();
tempImage.dispose();
}
}
return data;
}
}