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