package ie.dcu.segment.util; import org.eclipse.swt.graphics.*; /** * Convert a SWT ImageData object to a linear array of ARGB integers (alpha * channel is ignored). * * @author Kevin McGuinness */ public class ImageArgbConverter { private final int npixels; private final int[] pixels; /** * Create an converter object for images of the given size. * * @param width * The image width. * @param height * The image height. */ public ImageArgbConverter(int width, int height) { npixels = width*height; pixels = new int[npixels]; } /** * Convert an SWT ImageData object to a linear array of integers. Each * integer is a contains the red, green, and blue channels, ordered as * 0x00RRGGBB. The alpha channel is ignored. * * @param data * An image data object. * @param clone * If false returns a shared array, otherwise returns a * new array. * @return A int array of ARGB values in row-major order. */ public int[] convert(ImageData data, boolean clone) { PaletteData p = data.palette; data.getPixels(0, 0, npixels, pixels, 0); if (p.isDirect) { for (int i = 0; i < npixels; i++) { // Unpack int r, g, b, pel = pixels[i]; // red r = pel & p.redMask; r = (p.redShift < 0) ? r >>> -p.redShift : r << p.redShift; // green g = pel & p.greenMask; g = (p.greenShift < 0) ? g >>> -p.greenShift : g << p.greenShift; // blue b = pel & p.blueMask; b = (p.blueShift < 0) ? b >>> -p.blueShift : b << p.blueShift; // re-pack pixels[i] = pack(r, g, b); } } else { // Indirect palette for (int i = 0; i < npixels; i++) { RGB color = p.colors[pixels[i]]; pixels[i] = pack(color.red, color.green, color.blue); } } if (clone) { return pixels.clone(); } return pixels; } /** * Convert an SWT ImageData object to a linear array of integers. Each * integer is a contains the red, green, and blue channels, ordered as * 0x00RRGGBB. The alpha channel is ignored. * * @param data * An image data object. * @return A int array of ARGB values in row-major order. */ public static int[] convert(ImageData data) { return new ImageArgbConverter(data.width, data.height).convert(data, false); } private static final int pack(int r, int g, int b) { return 0x00ffffff & ((r << 16) | (g << 8) | b); } }