]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/gfx/PixelFormat.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.utils.ui / src / org / simantics / utils / ui / gfx / PixelFormat.java
diff --git a/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/gfx/PixelFormat.java b/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/gfx/PixelFormat.java
new file mode 100644 (file)
index 0000000..ee1d97e
--- /dev/null
@@ -0,0 +1,232 @@
+/*******************************************************************************\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
+package org.simantics.utils.ui.gfx;\r
+\r
+//import org.eclipse.ui.IMemento;\r
+\r
+/**\r
+ * PixelFormat\r
+ * @author Toni Kalajainen\r
+ */\r
+public final class PixelFormat {\r
+\r
+    public static PixelFormat RGB24 = new PixelFormat(0xff, 0xff00, 0xff0000, 0);\r
+    \r
+    /** red mask */\r
+    private final int redMask;\r
+    /** green mask */\r
+    private final int greenMask;\r
+    /** blue mask */\r
+    private final int blueMask;\r
+    /** alpha mask */\r
+    private final int alphaMask;\r
+    \r
+    private final int redHighBit;\r
+    private final int greenHighBit;\r
+    private final int blueHighBit;\r
+    private final int alphaHighBit;\r
+\r
+    private final int redLowBit;\r
+    private final int greenLowBit;\r
+    private final int blueLowBit;\r
+    private final int alphaLowBit;\r
+    \r
+    // Highest bit\r
+    private final int bitDepth;\r
+    \r
+    public PixelFormat(int redMask, int greenMask, int blueMask, int alphaMask) {\r
+        this.redMask = redMask;\r
+        this.greenMask = greenMask;\r
+        this.blueMask = blueMask;\r
+        this.alphaMask = alphaMask;\r
+\r
+        this.redHighBit = findHighestBit(redMask);\r
+        this.greenHighBit = findHighestBit(greenMask);\r
+        this.blueHighBit = findHighestBit(blueMask);\r
+        this.alphaHighBit = findHighestBit(alphaMask);\r
+\r
+        this.redLowBit = findLowestBit(redMask);\r
+        this.greenLowBit = findLowestBit(greenMask);\r
+        this.blueLowBit = findLowestBit(blueMask);\r
+        this.alphaLowBit = findLowestBit(alphaMask);\r
+        \r
+        this.bitDepth = findHighestBit(redMask|greenMask|blueMask|alphaMask)+1;        \r
+    }\r
+        \r
+    public boolean hasAlpha() {\r
+        return alphaMask != 0;\r
+    }\r
+    \r
+    /**\r
+     * Calculates mask's bit shift value\r
+     *\r
+     * @param mask color mask\r
+     */\r
+    static int calculateShiftFromMask(int mask) {\r
+        return 7-findHighestBit(mask);\r
+    }\r
+    \r
+    static int findHighestBit(int mask) {\r
+        // Scan bits starting from left. Find first bit\r
+        for (int i=31; i>=0; i--)\r
+            // Check if bit i is 1\r
+            if ((mask & (1<<i)) > 0) return i;\r
+        return 0;\r
+    }\r
+\r
+    static int findLowestBit(int mask) {\r
+        // Scan bits starting from left. Find first bit\r
+        for (int i=0; i<32; i++)\r
+            // Check if bit i is 1\r
+            if ((mask & (1<<i)) > 0) return i;\r
+        return 0;\r
+    }\r
+\r
+    public int getAlphaMask() {\r
+        return alphaMask;\r
+    }\r
+\r
+    public int getAlphaShift() {\r
+        return 7-alphaHighBit;\r
+    }\r
+\r
+    public int getAlphaDepth() {\r
+        return alphaHighBit-alphaLowBit+1;\r
+    }\r
+    \r
+    public int getAlphaHighBit() {\r
+        return alphaHighBit;\r
+    }\r
+    \r
+    public int getAlphaLowBit() {\r
+        return alphaLowBit;\r
+    }\r
+    \r
+    \r
+    public int getBlueMask() {\r
+        return blueMask;\r
+    }\r
+\r
+    public int getBlueShift() {\r
+        return 7- blueHighBit;\r
+    }\r
+\r
+    public int getBlueDepth() {\r
+        return blueHighBit-blueLowBit+1;\r
+    }\r
+    \r
+    public int getBlueHighBit() {\r
+        return blueHighBit;\r
+    }\r
+    \r
+    public int getBlueLowBit() {\r
+        return blueLowBit;\r
+    }\r
+\r
+    \r
+    public int getGreenMask() {\r
+        return greenMask;\r
+    }\r
+\r
+    public int getGreenShift() {\r
+        return 7-greenHighBit;\r
+    }\r
+\r
+    public int getGreenDepth() {\r
+        return greenHighBit-greenLowBit+1;\r
+    }\r
+    \r
+    public int getGreenHighBit() {\r
+        return greenHighBit;\r
+    }\r
+    \r
+    public int getGreenLowBit() {\r
+        return greenLowBit;\r
+    }\r
+\r
+    public int getRedMask() {\r
+        return redMask;\r
+    }\r
+    \r
+    public int getRedShift() {\r
+        return 7-redHighBit;\r
+    }\r
+\r
+    public int getRedDepth() {\r
+        return redHighBit-redLowBit+1;\r
+    }\r
+    \r
+    public int getRedHighBit() {\r
+        return redHighBit;\r
+    }\r
+    \r
+    public int getRedLowBit() {\r
+        return redLowBit;\r
+    }\r
+    \r
+    public int getBitDepth() {\r
+        return bitDepth; \r
+    }\r
+    \r
+    public int getNumberOfColorComponents() {\r
+        int result = 0;\r
+        if (redMask>0) result++;\r
+        if (greenMask>0) result++;\r
+        if (blueMask>0) result++;\r
+        if (alphaMask>0) result++;\r
+        return result;\r
+    }\r
+    \r
+    \r
+    /**\r
+     * Return pixel size in bytes\r
+     * @return pixel size in bytes\r
+     */\r
+    public int getPixelSize() {\r
+        return (bitDepth+7)/8; \r
+    }\r
+    \r
+    @Override\r
+    public int hashCode() {\r
+        return (redLowBit)|(redHighBit<<4)|(greenLowBit<<8)|(greenHighBit<<12)|(blueLowBit<<16)|(blueHighBit<<20)|(alphaLowBit<<24)|(alphaHighBit<<28); \r
+    }\r
+    \r
+    @Override\r
+    public boolean equals(Object o2) {\r
+        if (!o2.getClass().equals(this.getClass())) return false;\r
+        PixelFormat pf2 = (PixelFormat) o2;\r
+        return (redMask == pf2.redMask) && (greenMask == pf2.greenMask) && (blueMask == pf2.blueMask) && (alphaMask == pf2.alphaMask);\r
+    }    \r
+    \r
+    @Override\r
+    public String toString() {\r
+        return bitDepth+" bits";\r
+    }\r
+    \r
+//    public void saveState(IMemento memento)\r
+//    {   \r
+//        memento.putInteger("redMask", redMask);\r
+//        memento.putInteger("greenMask", greenMask);\r
+//        memento.putInteger("blueMask", blueMask);\r
+//        memento.putInteger("alphaMask", alphaMask);\r
+//    }\r
+//    \r
+//    public static PixelFormat restoreState(IMemento memento)\r
+//    {\r
+//        return new PixelFormat(\r
+//                memento.getInteger("redMask"),\r
+//                memento.getInteger("greenMask"),\r
+//                memento.getInteger("blueMask"),\r
+//                memento.getInteger("alphaMask")\r
+//                );\r
+//    }\r
+}\r