]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/gfx/ImageUtils.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.utils.ui / src / org / simantics / utils / ui / gfx / ImageUtils.java
index f95262f6afa277a10200e7f696c87ef0a6565d1c..7647c4ee220f22b140a48d9f4ed7fd53c03719a2 100644 (file)
-/*******************************************************************************\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
- * Created on 12.11.2005\r
- * @author Toni Kalajainen \r
- */\r
-package org.simantics.utils.ui.gfx;\r
-\r
-import java.awt.image.BufferedImage;\r
-import java.awt.image.ColorModel;\r
-import java.awt.image.ComponentColorModel;\r
-import java.awt.image.DirectColorModel;\r
-import java.awt.image.IndexColorModel;\r
-import java.awt.image.WritableRaster;\r
-import java.nio.ByteBuffer;\r
-\r
-import org.eclipse.swt.graphics.ImageData;\r
-import org.eclipse.swt.graphics.PaletteData;\r
-import org.eclipse.swt.graphics.RGB;\r
-\r
-public class ImageUtils {\r
-\r
-    public final static PaletteData RGB24 = new PaletteData(0xff, 0xff00, 0xff0000);\r
-\r
-    public static ImageData convertPaletteToRGB24(ImageData data) {\r
-        return convertPalette(data, RGB24, 24);\r
-    }\r
-\r
-    /**\r
-     * Converts image data to RGB format\r
-     * \r
-     * @param data source data\r
-     * @return result data\r
-     */\r
-    public static ImageData convertPalette(ImageData data, PaletteData newPalette, int newDepth) {\r
-        if (paletteDataEquals(data.palette, newPalette))\r
-            return data;\r
-        ImageData result = new ImageData(data.width, data.height, newDepth, newPalette);\r
-        boolean hasAlpha = data.alphaData != null;\r
-        int width = data.width;\r
-        int height = data.height;\r
-        // Very slow operation\r
-        for (int y = 0; y < height; y++)\r
-            for (int x = 0; x < width; x++) {\r
-                // convert RGBs\r
-                RGB rgb = data.palette.getRGB(data.getPixel(x, y));\r
-                result.setPixel(x, y, result.palette.getPixel(rgb));\r
-\r
-                // convert alpha\r
-                if (hasAlpha) {\r
-                    int alpha = data.getAlpha(x, y);\r
-                    result.setAlpha(x, y, alpha);\r
-                }\r
-            }\r
-        return result;\r
-    }\r
-\r
-    /**\r
-     * Convert Device-independent image data format from one format to another.\r
-     * \r
-     * @param sourceImage source image, it must contain image data\r
-     * @param destImage destination image, it must be empty image\r
-     */\r
-    // public static void convertImageData(ImageData sourceImage, ImageData\r
-    // destImage) {\r
-    // int swid = sourceImage.width;\r
-    // int shei = sourceImage.height;\r
-    // int dwid = destImage.width;\r
-    // int dhei = destImage.height;\r
-    //        \r
-    // // resize\r
-    // if (swid!=dwid || shei!=dhei)\r
-    // sourceImage = sourceImage.scaledTo(dwid, dhei);\r
-    //        \r
-    // // Convert palette\r
-    // PaletteData spal = sourceImage.palette;\r
-    // PaletteData dpal = destImage.palette;\r
-    // }\r
-    public static boolean paletteDataEquals(PaletteData p1, PaletteData p2) {\r
-        if (p1.isDirect != p2.isDirect)\r
-            return false;\r
-        if (!p1.isDirect) {\r
-            RGB rgb1[] = p1.colors;\r
-            RGB rgb2[] = p2.colors;\r
-            if (rgb1.length != rgb2.length)\r
-                return false;\r
-            for (int i = 0; i < rgb1.length; i++)\r
-                if (rgb1[i].blue != rgb2[i].blue || rgb1[i].green != rgb2[i].green || rgb1[i].red != rgb2[i].red)\r
-                    return false;\r
-            return true;\r
-        }\r
-\r
-        if (p1.blueMask != p2.blueMask)\r
-            return false;\r
-        if (p1.blueShift != p2.blueShift)\r
-            return false;\r
-        if (p1.greenMask != p2.greenShift)\r
-            return false;\r
-        if (p1.greenMask != p2.greenMask)\r
-            return false;\r
-        if (p1.redMask != p2.redMask)\r
-            return false;\r
-        if (p1.redShift != p2.redShift)\r
-            return false;\r
-\r
-        return true;\r
-    }\r
-\r
-    // ks. org.eclipse.gmf.runtime.draw2d.ui.render.image.ImageConverter\r
-    // Sama toiminnallisuus, mutta GMF riippuvuus\r
-    public static BufferedImage convertToAWT(ImageData data) {\r
-        ColorModel colorModel = null;\r
-        PaletteData palette = data.palette;\r
-        if (palette.isDirect) {\r
-            // has alpha and is 24bit (others are not supported)\r
-            if (data.alphaData != null && data.depth==24) {\r
-                colorModel = new DirectColorModel(data.depth+8, palette.redMask, palette.greenMask, palette.blueMask, 0xff000000);\r
-                BufferedImage bufferedImage = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(data.width, data.height), false, null);\r
-                WritableRaster raster = bufferedImage.getRaster();\r
-                int[] pixelArray = new int[4];\r
-                for (int y = 0; y < data.height; y++) {\r
-                    for (int x = 0; x < data.width; x++) {\r
-                        int pixel = data.getPixel(x, y);\r
-                        RGB rgb = palette.getRGB(pixel);\r
-                        pixelArray[0] = rgb.red;\r
-                        pixelArray[1] = rgb.green;\r
-                        pixelArray[2] = rgb.blue;\r
-                        pixelArray[3] = data.getAlpha(x, y);\r
-                        raster.setPixels(x, y, 1, 1, pixelArray);\r
-                    }\r
-                }\r
-                return bufferedImage;\r
-            } else {\r
-               // FIXME: this does not work with 16bit images (colors are wrong)\r
-                colorModel = new DirectColorModel(data.depth, palette.redMask, palette.greenMask, palette.blueMask);\r
-                BufferedImage bufferedImage = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(data.width, data.height), false, null);\r
-                WritableRaster raster = bufferedImage.getRaster();\r
-                int[] pixelArray = new int[3];\r
-                for (int y = 0; y < data.height; y++) {\r
-                    for (int x = 0; x < data.width; x++) {\r
-                        int pixel = data.getPixel(x, y);\r
-                        RGB rgb = palette.getRGB(pixel);\r
-                        pixelArray[0] = rgb.red;\r
-                        pixelArray[1] = rgb.green;\r
-                        pixelArray[2] = rgb.blue;\r
-                        raster.setPixels(x, y, 1, 1, pixelArray);\r
-                    }\r
-                }\r
-                return bufferedImage;\r
-            }\r
-        } else {\r
-            RGB[] rgbs = palette.getRGBs();\r
-            byte[] red = new byte[rgbs.length];\r
-            byte[] green = new byte[rgbs.length];\r
-            byte[] blue = new byte[rgbs.length];\r
-            for (int i = 0; i < rgbs.length; i++) {\r
-                RGB rgb = rgbs[i];\r
-                red[i] = (byte) rgb.red;\r
-                green[i] = (byte) rgb.green;\r
-                blue[i] = (byte) rgb.blue;\r
-            }\r
-            if (data.transparentPixel != -1) {\r
-                colorModel = new IndexColorModel(data.depth, rgbs.length, red, green, blue, data.transparentPixel);\r
-            } else {\r
-                colorModel = new IndexColorModel(data.depth, rgbs.length, red, green, blue);\r
-            }\r
-            BufferedImage bufferedImage = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(data.width, data.height), false, null);\r
-            WritableRaster raster = bufferedImage.getRaster();\r
-            int[] pixelArray = new int[1];\r
-            for (int y = 0; y < data.height; y++) {\r
-                for (int x = 0; x < data.width; x++) {\r
-                    int pixel = data.getPixel(x, y);\r
-                    pixelArray[0] = pixel;\r
-                    raster.setPixel(x, y, pixelArray);\r
-                }\r
-            }\r
-            return bufferedImage;\r
-        }\r
-    }\r
-\r
-    public static ImageData convertToSWT(BufferedImage bufferedImage) {\r
-        if (bufferedImage.getColorModel() instanceof DirectColorModel) {\r
-            DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel();\r
-            PaletteData palette = new PaletteData(colorModel.getRedMask(), colorModel.getGreenMask(), colorModel.getBlueMask());\r
-            ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette);\r
-            WritableRaster raster = bufferedImage.getRaster();\r
-            int[] pixelArray = { 0, 0, 0, 255 };\r
-            for (int y = 0; y < data.height; y++) {\r
-                for (int x = 0; x < data.width; x++) {\r
-                    raster.getPixel(x, y, pixelArray);\r
-                    int pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1], pixelArray[2]));\r
-                    data.setPixel(x, y, pixel);\r
-                    data.setAlpha(x, y, pixelArray[3]);\r
-                }\r
-            }\r
-            return data;\r
-        } else if (bufferedImage.getColorModel() instanceof IndexColorModel) {\r
-            IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel();\r
-            int size = colorModel.getMapSize();\r
-            byte[] reds = new byte[size];\r
-            byte[] greens = new byte[size];\r
-            byte[] blues = new byte[size];\r
-            colorModel.getReds(reds);\r
-            colorModel.getGreens(greens);\r
-            colorModel.getBlues(blues);\r
-            RGB[] rgbs = new RGB[size];\r
-            for (int i = 0; i < rgbs.length; i++) {\r
-                rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, blues[i] & 0xFF);\r
-            }\r
-            PaletteData palette = new PaletteData(rgbs);\r
-            ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette);\r
-            data.transparentPixel = colorModel.getTransparentPixel();\r
-            WritableRaster raster = bufferedImage.getRaster();\r
-            int[] pixelArray = new int[1];\r
-            for (int y = 0; y < data.height; y++) {\r
-                for (int x = 0; x < data.width; x++) {\r
-                    raster.getPixel(x, y, pixelArray);\r
-                    data.setPixel(x, y, pixelArray[0]);\r
-                }\r
-            }\r
-            return data;\r
-        }  else if (bufferedImage.getColorModel() instanceof ComponentColorModel) {\r
-               // works with BufferedImage.TYPE_3BYTE_BGR\r
-                ComponentColorModel colorModel = (ComponentColorModel)bufferedImage.getColorModel();\r
-                PaletteData palette = new PaletteData(0xFF0000, 0x00FF00, 0x0000FF);\r
-             ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette);\r
-             WritableRaster raster = bufferedImage.getRaster();\r
-             int[] pixelArray = { 0, 0, 0, 255 };\r
-             for (int y = 0; y < data.height; y++) {\r
-                 for (int x = 0; x < data.width; x++) {\r
-                     raster.getPixel(x, y, pixelArray);\r
-                     int pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1], pixelArray[2]));\r
-                     data.setPixel(x, y, pixel);\r
-                     data.setAlpha(x, y, pixelArray[3]);\r
-                 }\r
-             }\r
-             return data;\r
-        }\r
-        return null;\r
-    }\r
-\r
-    /**\r
-     * Creates ImageData from RGBA byte array\r
-     * \r
-     * @param width width of the image\r
-     * @param height height of the image\r
-     * @param data data of the image\r
-     * @return <code>ImageData</code>\r
-     */\r
-    public static ImageData _getImageDataFromRGBA(int width, int height, byte[] data) {\r
-        // these seem to do nothing, r and b channels are flipped anyways\r
-        int redMask = 0x0000ff00;\r
-        int greenMask = 0x00ff0000;\r
-        int blueMask = 0xff000000;\r
-        PaletteData paletteData = new PaletteData(redMask, greenMask, blueMask);\r
-        // flipping r and b channels\r
-        int maxByte = width * height * 4;\r
-        byte t;\r
-        for (int i = 0; i < maxByte; i += 4) {\r
-            t = data[i];\r
-            data[i] = data[i + 2];\r
-            data[i + 2] = t;\r
-        }\r
-        ImageData imageData = new ImageData(width, height, 32, paletteData, 4, data);\r
-        // TODO add alpha channel\r
-        // imageData.alphaData = xyz\r
-        return imageData;\r
-    }\r
-    \r
-    \r
-    /**\r
-     * Converts ImageData to RGB(A) ByteBuffer\r
-     * @param imageData\r
-     * @param buffer\r
-     */\r
-    public static void convertToRGBA(ImageData imageData, ByteBuffer buffer) {\r
-       int width = imageData.width;\r
-       int height = imageData.height;\r
-       if (!imageData.palette.isDirect || imageData.depth != 24) {\r
-               ImageUtils.convertPaletteToRGB24(imageData);\r
-       }\r
-       boolean hasAlpha = false;\r
-       if (imageData.alphaData != null) {\r
-               hasAlpha = true;\r
-       }\r
-       int index;\r
-       RGB rgb;\r
-       for (int j = 0; j < height; j++) {\r
-               for (int i = 0; i < width; i++) {\r
-                        index = j*width + i;\r
-                        rgb = imageData.palette.getRGB(imageData.getPixel(i, j));\r
-                        buffer.put((byte)rgb.red);\r
-                        buffer.put((byte)rgb.green);\r
-                        buffer.put((byte)rgb.blue);\r
-                        if (hasAlpha) {\r
-                                buffer.put(imageData.alphaData[index]);\r
-                        }\r
-               }\r
-       }\r
-       \r
-    }\r
-\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on 12.11.2005
+ * @author Toni Kalajainen 
+ */
+package org.simantics.utils.ui.gfx;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DirectColorModel;
+import java.awt.image.IndexColorModel;
+import java.awt.image.WritableRaster;
+import java.nio.ByteBuffer;
+
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.PaletteData;
+import org.eclipse.swt.graphics.RGB;
+
+public class ImageUtils {
+
+    public final static PaletteData RGB24 = new PaletteData(0xff, 0xff00, 0xff0000);
+
+    public static ImageData convertPaletteToRGB24(ImageData data) {
+        return convertPalette(data, RGB24, 24);
+    }
+
+    /**
+     * Converts image data to RGB format
+     * 
+     * @param data source data
+     * @return result data
+     */
+    public static ImageData convertPalette(ImageData data, PaletteData newPalette, int newDepth) {
+        if (paletteDataEquals(data.palette, newPalette))
+            return data;
+        ImageData result = new ImageData(data.width, data.height, newDepth, newPalette);
+        boolean hasAlpha = data.alphaData != null;
+        int width = data.width;
+        int height = data.height;
+        // Very slow operation
+        for (int y = 0; y < height; y++)
+            for (int x = 0; x < width; x++) {
+                // convert RGBs
+                RGB rgb = data.palette.getRGB(data.getPixel(x, y));
+                result.setPixel(x, y, result.palette.getPixel(rgb));
+
+                // convert alpha
+                if (hasAlpha) {
+                    int alpha = data.getAlpha(x, y);
+                    result.setAlpha(x, y, alpha);
+                }
+            }
+        return result;
+    }
+
+    /**
+     * Convert Device-independent image data format from one format to another.
+     * 
+     * @param sourceImage source image, it must contain image data
+     * @param destImage destination image, it must be empty image
+     */
+    // public static void convertImageData(ImageData sourceImage, ImageData
+    // destImage) {
+    // int swid = sourceImage.width;
+    // int shei = sourceImage.height;
+    // int dwid = destImage.width;
+    // int dhei = destImage.height;
+    //        
+    // // resize
+    // if (swid!=dwid || shei!=dhei)
+    // sourceImage = sourceImage.scaledTo(dwid, dhei);
+    //        
+    // // Convert palette
+    // PaletteData spal = sourceImage.palette;
+    // PaletteData dpal = destImage.palette;
+    // }
+    public static boolean paletteDataEquals(PaletteData p1, PaletteData p2) {
+        if (p1.isDirect != p2.isDirect)
+            return false;
+        if (!p1.isDirect) {
+            RGB rgb1[] = p1.colors;
+            RGB rgb2[] = p2.colors;
+            if (rgb1.length != rgb2.length)
+                return false;
+            for (int i = 0; i < rgb1.length; i++)
+                if (rgb1[i].blue != rgb2[i].blue || rgb1[i].green != rgb2[i].green || rgb1[i].red != rgb2[i].red)
+                    return false;
+            return true;
+        }
+
+        if (p1.blueMask != p2.blueMask)
+            return false;
+        if (p1.blueShift != p2.blueShift)
+            return false;
+        if (p1.greenMask != p2.greenShift)
+            return false;
+        if (p1.greenMask != p2.greenMask)
+            return false;
+        if (p1.redMask != p2.redMask)
+            return false;
+        if (p1.redShift != p2.redShift)
+            return false;
+
+        return true;
+    }
+
+    // ks. org.eclipse.gmf.runtime.draw2d.ui.render.image.ImageConverter
+    // Sama toiminnallisuus, mutta GMF riippuvuus
+    public static BufferedImage convertToAWT(ImageData data) {
+        ColorModel colorModel = null;
+        PaletteData palette = data.palette;
+        if (palette.isDirect) {
+            // has alpha and is 24bit (others are not supported)
+            if (data.alphaData != null && data.depth==24) {
+                colorModel = new DirectColorModel(data.depth+8, palette.redMask, palette.greenMask, palette.blueMask, 0xff000000);
+                BufferedImage bufferedImage = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(data.width, data.height), false, null);
+                WritableRaster raster = bufferedImage.getRaster();
+                int[] pixelArray = new int[4];
+                for (int y = 0; y < data.height; y++) {
+                    for (int x = 0; x < data.width; x++) {
+                        int pixel = data.getPixel(x, y);
+                        RGB rgb = palette.getRGB(pixel);
+                        pixelArray[0] = rgb.red;
+                        pixelArray[1] = rgb.green;
+                        pixelArray[2] = rgb.blue;
+                        pixelArray[3] = data.getAlpha(x, y);
+                        raster.setPixels(x, y, 1, 1, pixelArray);
+                    }
+                }
+                return bufferedImage;
+            } else {
+               // FIXME: this does not work with 16bit images (colors are wrong)
+                colorModel = new DirectColorModel(data.depth, palette.redMask, palette.greenMask, palette.blueMask);
+                BufferedImage bufferedImage = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(data.width, data.height), false, null);
+                WritableRaster raster = bufferedImage.getRaster();
+                int[] pixelArray = new int[3];
+                for (int y = 0; y < data.height; y++) {
+                    for (int x = 0; x < data.width; x++) {
+                        int pixel = data.getPixel(x, y);
+                        RGB rgb = palette.getRGB(pixel);
+                        pixelArray[0] = rgb.red;
+                        pixelArray[1] = rgb.green;
+                        pixelArray[2] = rgb.blue;
+                        raster.setPixels(x, y, 1, 1, pixelArray);
+                    }
+                }
+                return bufferedImage;
+            }
+        } else {
+            RGB[] rgbs = palette.getRGBs();
+            byte[] red = new byte[rgbs.length];
+            byte[] green = new byte[rgbs.length];
+            byte[] blue = new byte[rgbs.length];
+            for (int i = 0; i < rgbs.length; i++) {
+                RGB rgb = rgbs[i];
+                red[i] = (byte) rgb.red;
+                green[i] = (byte) rgb.green;
+                blue[i] = (byte) rgb.blue;
+            }
+            if (data.transparentPixel != -1) {
+                colorModel = new IndexColorModel(data.depth, rgbs.length, red, green, blue, data.transparentPixel);
+            } else {
+                colorModel = new IndexColorModel(data.depth, rgbs.length, red, green, blue);
+            }
+            BufferedImage bufferedImage = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(data.width, data.height), false, null);
+            WritableRaster raster = bufferedImage.getRaster();
+            int[] pixelArray = new int[1];
+            for (int y = 0; y < data.height; y++) {
+                for (int x = 0; x < data.width; x++) {
+                    int pixel = data.getPixel(x, y);
+                    pixelArray[0] = pixel;
+                    raster.setPixel(x, y, pixelArray);
+                }
+            }
+            return bufferedImage;
+        }
+    }
+
+    public static ImageData convertToSWT(BufferedImage bufferedImage) {
+        if (bufferedImage.getColorModel() instanceof DirectColorModel) {
+            DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel();
+            PaletteData palette = new PaletteData(colorModel.getRedMask(), colorModel.getGreenMask(), colorModel.getBlueMask());
+            ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette);
+            WritableRaster raster = bufferedImage.getRaster();
+            int[] pixelArray = { 0, 0, 0, 255 };
+            for (int y = 0; y < data.height; y++) {
+                for (int x = 0; x < data.width; x++) {
+                    raster.getPixel(x, y, pixelArray);
+                    int pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1], pixelArray[2]));
+                    data.setPixel(x, y, pixel);
+                    data.setAlpha(x, y, pixelArray[3]);
+                }
+            }
+            return data;
+        } else if (bufferedImage.getColorModel() instanceof IndexColorModel) {
+            IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel();
+            int size = colorModel.getMapSize();
+            byte[] reds = new byte[size];
+            byte[] greens = new byte[size];
+            byte[] blues = new byte[size];
+            colorModel.getReds(reds);
+            colorModel.getGreens(greens);
+            colorModel.getBlues(blues);
+            RGB[] rgbs = new RGB[size];
+            for (int i = 0; i < rgbs.length; i++) {
+                rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, blues[i] & 0xFF);
+            }
+            PaletteData palette = new PaletteData(rgbs);
+            ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette);
+            data.transparentPixel = colorModel.getTransparentPixel();
+            WritableRaster raster = bufferedImage.getRaster();
+            int[] pixelArray = new int[1];
+            for (int y = 0; y < data.height; y++) {
+                for (int x = 0; x < data.width; x++) {
+                    raster.getPixel(x, y, pixelArray);
+                    data.setPixel(x, y, pixelArray[0]);
+                }
+            }
+            return data;
+        }  else if (bufferedImage.getColorModel() instanceof ComponentColorModel) {
+               // works with BufferedImage.TYPE_3BYTE_BGR
+                ComponentColorModel colorModel = (ComponentColorModel)bufferedImage.getColorModel();
+                PaletteData palette = new PaletteData(0xFF0000, 0x00FF00, 0x0000FF);
+             ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette);
+             WritableRaster raster = bufferedImage.getRaster();
+             int[] pixelArray = { 0, 0, 0, 255 };
+             for (int y = 0; y < data.height; y++) {
+                 for (int x = 0; x < data.width; x++) {
+                     raster.getPixel(x, y, pixelArray);
+                     int pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1], pixelArray[2]));
+                     data.setPixel(x, y, pixel);
+                     data.setAlpha(x, y, pixelArray[3]);
+                 }
+             }
+             return data;
+        }
+        return null;
+    }
+
+    /**
+     * Creates ImageData from RGBA byte array
+     * 
+     * @param width width of the image
+     * @param height height of the image
+     * @param data data of the image
+     * @return <code>ImageData</code>
+     */
+    public static ImageData _getImageDataFromRGBA(int width, int height, byte[] data) {
+        // these seem to do nothing, r and b channels are flipped anyways
+        int redMask = 0x0000ff00;
+        int greenMask = 0x00ff0000;
+        int blueMask = 0xff000000;
+        PaletteData paletteData = new PaletteData(redMask, greenMask, blueMask);
+        // flipping r and b channels
+        int maxByte = width * height * 4;
+        byte t;
+        for (int i = 0; i < maxByte; i += 4) {
+            t = data[i];
+            data[i] = data[i + 2];
+            data[i + 2] = t;
+        }
+        ImageData imageData = new ImageData(width, height, 32, paletteData, 4, data);
+        // TODO add alpha channel
+        // imageData.alphaData = xyz
+        return imageData;
+    }
+    
+    
+    /**
+     * Converts ImageData to RGB(A) ByteBuffer
+     * @param imageData
+     * @param buffer
+     */
+    public static void convertToRGBA(ImageData imageData, ByteBuffer buffer) {
+       int width = imageData.width;
+       int height = imageData.height;
+       if (!imageData.palette.isDirect || imageData.depth != 24) {
+               ImageUtils.convertPaletteToRGB24(imageData);
+       }
+       boolean hasAlpha = false;
+       if (imageData.alphaData != null) {
+               hasAlpha = true;
+       }
+       int index;
+       RGB rgb;
+       for (int j = 0; j < height; j++) {
+               for (int i = 0; i < width; i++) {
+                        index = j*width + i;
+                        rgb = imageData.palette.getRGB(imageData.getPixel(i, j));
+                        buffer.put((byte)rgb.red);
+                        buffer.put((byte)rgb.green);
+                        buffer.put((byte)rgb.blue);
+                        if (hasAlpha) {
+                                buffer.put(imageData.alphaData[index]);
+                        }
+               }
+       }
+       
+    }
+
+}