--- /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
+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