/* ******************************************************************************
* 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.internal.image;
import java.io.IOException;
import java.io.OutputStream;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.util.Util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.xmind.gef.image.ImageWriter;
public class SWTImageWriter extends ImageWriter {
private int format;
public SWTImageWriter(Image image, int format, OutputStream output) {
super(image, output);
this.format = format;
}
public SWTImageWriter(ImageData[] imageData, int format, OutputStream output) {
super(imageData, output);
this.format = format;
}
public int getFormat() {
return format;
}
public void write(IProgressMonitor monitor) throws IOException {
ImageData[] data = getCompatibleImageData();
ImageLoader loader = new ImageLoader();
loader.data = data;
try {
loader.save(getOutput(), getFormat());
} catch (Throwable e) {
throw new IOException(e.getMessage());
}
}
protected ImageData[] getCompatibleImageData() {
ImageData[] oldData = getImageData();
return needsDepthConvertion(getFormat()) ? convertTo256Colors(oldData)
: oldData;
}
protected ImageData[] convertTo256Colors(ImageData[] imageData) {
ImageData[] newImageData = new ImageData[imageData.length];
for (int i = 0; i < imageData.length; i++) {
newImageData[i] = ImageConverter.converTo256Colors(imageData[i]);
}
return newImageData;
}
private static boolean needsDepthConvertion(int format) {
return format == SWT.IMAGE_GIF
|| (format == SWT.IMAGE_BMP && Util.isMac());
}
}