--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+/*\r
+ * 27.12.2006\r
+ */\r
+package org.simantics.utils.ui.gfx;\r
+\r
+import java.util.Collection;\r
+\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.ImageData;\r
+import org.eclipse.swt.graphics.PaletteData;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.RGB;\r
+import org.simantics.utils.datastructures.Array;\r
+\r
+/**\r
+ * CompositionImageDescriptor is image description that composes\r
+ * multiple images into one image.\r
+ * <p> \r
+ * \r
+ * @author Toni Kalajainen\r
+ */\r
+@SuppressWarnings("deprecation")\r
+public class CompositionImageDescriptor extends ImageDescriptor {\r
+\r
+ public static final PaletteData DEFAULT_PALETTEDATA = \r
+ new PaletteData(0x00ff0000, 0x0000ff00, 0x000000ff);\r
+ \r
+ public static ImageDescriptor compose(ImageDescriptor ... imageDescriptors) {\r
+ if (imageDescriptors.length == 1)\r
+ return imageDescriptors[0];\r
+ return new CompositionImageDescriptor(imageDescriptors);\r
+ }\r
+ \r
+ public static ImageDescriptor compose(Collection<ImageDescriptor> imageDescriptors) {\r
+ int size = imageDescriptors.size();\r
+ if (size == 1)\r
+ return imageDescriptors.iterator().next();\r
+ return new CompositionImageDescriptor(imageDescriptors.toArray(new ImageDescriptor[size]));\r
+ } \r
+ \r
+ ImageCache cache = ImageCache.getInstance();\r
+ final Array<ImageDescriptor> ids;\r
+ Point size;\r
+\r
+ public CompositionImageDescriptor(ImageDescriptor[] ids) {\r
+ this.ids = new Array<ImageDescriptor>(ids); \r
+ // Make sure that the argument is valid\r
+ assert (this.ids.size() > 0);\r
+ for (ImageDescriptor id : ids)\r
+ assert (id != null);\r
+ }\r
+ \r
+ public CompositionImageDescriptor(Array<ImageDescriptor> ids) {\r
+ this.ids = ids;\r
+ // Make sure that the argument is valid\r
+ assert (this.ids.size() > 0);\r
+ for (ImageDescriptor id : ids.toArray())\r
+ assert (id != null);\r
+ }\r
+ \r
+ @Override\r
+ public ImageData getImageData() {\r
+ ImageDescriptor [] _ids = ids.toArray();\r
+ if (_ids.length==1)\r
+ return cache.getImage(_ids[0]).getImageData();\r
+ \r
+ Point s = getSize(); \r
+ PaletteData palette = DEFAULT_PALETTEDATA;\r
+ ImageData id = new ImageData(s.x, s.y, 24, palette);\r
+ id.setAlpha(0,0,0);\r
+ for (int i=0; i<_ids.length; i++)\r
+ {\r
+ ImageData layer = ImageCache.getInstance().getImage(_ids[i]).getImageData();\r
+ int width = Math.min(s.x, layer.width);\r
+ int height = Math.min(s.y, layer.height);\r
+ PaletteData layerPaletteData = layer.palette;\r
+ if (layer.getTransparencyType()==SWT.TRANSPARENCY_MASK ||\r
+ layer.getTransparencyType()==SWT.TRANSPARENCY_PIXEL)\r
+ {\r
+ ImageData mask = layer.getTransparencyMask();\r
+ for (int y=0; y<height; y++)\r
+ for (int x=0; x<width; x++)\r
+ if (mask.getPixel(x, y)==1) {\r
+ RGB rgb = layerPaletteData.getRGB(layer.getPixel(x, y));\r
+ id.setPixel(x, y, palette.getPixel(rgb));\r
+ id.setAlpha(x, y, 255);\r
+ }\r
+ } else {\r
+ for (int y=0; y<height; y++)\r
+ for (int x=0; x<width; x++)\r
+ { \r
+ int layerAlpha = layer.getAlpha(x, y);\r
+ int origAlpha = id.getAlpha(x,y);\r
+ RGB layerRGB = layerPaletteData.getRGB(layer.getPixel(x, y));\r
+ RGB origRGB = palette.getRGB(id.getPixel(x, y));\r
+ int newR = ( ( origRGB.red * (255-layerAlpha) ) +\r
+ ( layerRGB.red * (layerAlpha) ) ) / 255;\r
+ int newG = ( ( origRGB.green * (255-layerAlpha) ) +\r
+ ( layerRGB.green * (layerAlpha) ) ) / 255;\r
+ int newB = ( ( origRGB.blue * (255-layerAlpha) ) +\r
+ ( layerRGB.blue * (layerAlpha) ) ) / 255; \r
+ int newAlpha = origAlpha + ((255-origAlpha)*layerAlpha)/255;\r
+ id.setPixel(x, y, palette.getPixel(new RGB(newR, newG, newB)));\r
+ id.setAlpha(x, y, newAlpha);\r
+ } \r
+ }\r
+ \r
+ }\r
+ //ImageData orig = ImageCache.getInstance().getImage(desc).getImageData();\r
+ \r
+ return id;\r
+ }\r
+ \r
+ private Point _countSize()\r
+ {\r
+ int width = 0;\r
+ int height = 0;\r
+ for (ImageDescriptor id : ids.toArray())\r
+ {\r
+ Image i = cache.getImage(id); \r
+ int w = i.getImageData().width;\r
+ if (w>width) width = w;\r
+ int h = i.getImageData().height;\r
+ if (h>height) height = h;\r
+ }\r
+ return new Point(width, height);\r
+ }\r
+ \r
+ protected Point getSize() {\r
+ if (size==null) size = _countSize(); \r
+ return size;\r
+ } \r
+ \r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (!(obj instanceof CompositionImageDescriptor))\r
+ return false;\r
+ CompositionImageDescriptor other = (CompositionImageDescriptor) obj;\r
+ return other.ids.equals(ids);\r
+ }\r
+ \r
+ @Override\r
+ public int hashCode() {\r
+ return ids.hashCode();\r
+ } \r
+\r
+}\r