/* ******************************************************************************
* 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 java.io.OutputStream;
import org.eclipse.draw2d.FreeformFigure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Rectangle;
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.eclipse.swt.graphics.ImageLoader;
import org.xmind.gef.draw2d.geometry.Geometry;
import org.xmind.gef.internal.image.ConstrainedExportAreaProvider;
import org.xmind.gef.internal.image.FittedExportAreaProvider;
import org.xmind.gef.internal.image.MaxPixelsExportAreaProvider;
import org.xmind.gef.internal.image.SWTImageWriter;
import org.xmind.gef.internal.image.StretchedExportAreaProvider;
public class ImageExportUtils {
public static IExportAreaProvider createExportAreaProvider(
Rectangle sourceArea) {
return createExportAreaProvider(sourceArea, ResizeConstants.RESIZE_NONE,
-1, -1, null);
}
public static IExportAreaProvider createExportAreaProvider(
Rectangle sourceArea, int resizeStrategy) {
return createExportAreaProvider(sourceArea, resizeStrategy, -1, -1,
null);
}
public static IExportAreaProvider createExportAreaProvider(
Rectangle sourceArea, int resizeStrategy, int wHint, int hHint) {
return createExportAreaProvider(sourceArea, resizeStrategy, wHint,
hHint, null);
}
public static IExportAreaProvider createExportAreaProvider(
Rectangle sourceArea, int resizeStrategy, Insets margins) {
return createExportAreaProvider(sourceArea, resizeStrategy, -1, -1,
margins);
}
public static IExportAreaProvider createExportAreaProvider(
Rectangle sourceArea, Insets margins) {
return createExportAreaProvider(sourceArea, ResizeConstants.RESIZE_NONE,
-1, -1, margins);
}
public static IExportAreaProvider createExportAreaProvider(
Rectangle sourceArea, int resizeStrategy, int wHint, int hHint,
Insets margins) {
switch (resizeStrategy) {
case ResizeConstants.RESIZE_STRETCH:
return new StretchedExportAreaProvider(sourceArea, wHint, hHint,
margins);
case ResizeConstants.RESIZE_FIT:
return new FittedExportAreaProvider(sourceArea, wHint, hHint,
margins);
case ResizeConstants.RESIZE_CONSTRAIN:
return new ConstrainedExportAreaProvider(sourceArea, wHint, hHint,
margins);
case ResizeConstants.RESIZE_MAXPIXELS:
return new MaxPixelsExportAreaProvider(sourceArea, wHint, hHint,
margins);
}
return new ExportAreaProvider(sourceArea, wHint, hHint, margins);
}
public static ImageWriter createImageWriter(Image image, int format,
OutputStream output) {
return new SWTImageWriter(image, format, output);
}
public static ImageWriter createImageWriter(ImageData[] imageData,
int format, OutputStream output) {
return new SWTImageWriter(imageData, format, output);
}
public static Rectangle calcBoundsUnion(IFigure[] figures) {
Rectangle r = null;
for (IFigure figure : figures) {
r = Geometry.union(r, getBounds(figure));
}
return r;
}
public static Rectangle calcBoundsIntersection(IFigure[] figures) {
Rectangle r = null;
for (IFigure figure : figures) {
r = Geometry.intersect(r, getBounds(figure));
}
return r;
}
public static Rectangle getBounds(IFigure figure) {
if (figure instanceof FreeformFigure) {
return ((FreeformFigure) figure).getFreeformExtent();
}
return figure.getBounds();
}
public static Image createImage(Device device, IExportSourceProvider source,
int resizeStrategy, int wHint, int hHint) {
IExportAreaProvider area = createExportAreaProvider(
source.getSourceArea(), resizeStrategy, wHint, hHint,
source.getMargins());
FigureRenderer renderer = new FigureRenderer();
renderer.init(source, area);
return createImage(device, renderer);
// ImageDescriptor imageDescriptor = createImageDescriptor(source,
// resizeStrategy, wHint, hHint);
// return imageDescriptor.createImage(false, device);
}
public static Image createImage(Device device, FigureRenderer renderer) {
Rectangle bounds = renderer.getBounds();
Image image = new Image(device, bounds.width, bounds.height);
GC gc = new GC(image);
try {
renderer.render(gc);
} finally {
gc.dispose();
}
return image;
}
/**
*
* @param image
* @param stream
* @param format
*/
public static void saveImage(Image image, OutputStream stream, int format) {
ImageData data = image.getImageData();
ImageLoader saver = new ImageLoader();
saver.data = new ImageData[] { data };
saver.save(stream, format);
}
}