]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/gfx/PixelFormat.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.utils.ui / src / org / simantics / utils / ui / gfx / PixelFormat.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.utils.ui.gfx;\r
13 \r
14 //import org.eclipse.ui.IMemento;\r
15 \r
16 /**\r
17  * PixelFormat\r
18  * @author Toni Kalajainen\r
19  */\r
20 public final class PixelFormat {\r
21 \r
22     public static PixelFormat RGB24 = new PixelFormat(0xff, 0xff00, 0xff0000, 0);\r
23     \r
24     /** red mask */\r
25     private final int redMask;\r
26     /** green mask */\r
27     private final int greenMask;\r
28     /** blue mask */\r
29     private final int blueMask;\r
30     /** alpha mask */\r
31     private final int alphaMask;\r
32     \r
33     private final int redHighBit;\r
34     private final int greenHighBit;\r
35     private final int blueHighBit;\r
36     private final int alphaHighBit;\r
37 \r
38     private final int redLowBit;\r
39     private final int greenLowBit;\r
40     private final int blueLowBit;\r
41     private final int alphaLowBit;\r
42     \r
43     // Highest bit\r
44     private final int bitDepth;\r
45     \r
46     public PixelFormat(int redMask, int greenMask, int blueMask, int alphaMask) {\r
47         this.redMask = redMask;\r
48         this.greenMask = greenMask;\r
49         this.blueMask = blueMask;\r
50         this.alphaMask = alphaMask;\r
51 \r
52         this.redHighBit = findHighestBit(redMask);\r
53         this.greenHighBit = findHighestBit(greenMask);\r
54         this.blueHighBit = findHighestBit(blueMask);\r
55         this.alphaHighBit = findHighestBit(alphaMask);\r
56 \r
57         this.redLowBit = findLowestBit(redMask);\r
58         this.greenLowBit = findLowestBit(greenMask);\r
59         this.blueLowBit = findLowestBit(blueMask);\r
60         this.alphaLowBit = findLowestBit(alphaMask);\r
61         \r
62         this.bitDepth = findHighestBit(redMask|greenMask|blueMask|alphaMask)+1;        \r
63     }\r
64         \r
65     public boolean hasAlpha() {\r
66         return alphaMask != 0;\r
67     }\r
68     \r
69     /**\r
70      * Calculates mask's bit shift value\r
71      *\r
72      * @param mask color mask\r
73      */\r
74     static int calculateShiftFromMask(int mask) {\r
75         return 7-findHighestBit(mask);\r
76     }\r
77     \r
78     static int findHighestBit(int mask) {\r
79         // Scan bits starting from left. Find first bit\r
80         for (int i=31; i>=0; i--)\r
81             // Check if bit i is 1\r
82             if ((mask & (1<<i)) > 0) return i;\r
83         return 0;\r
84     }\r
85 \r
86     static int findLowestBit(int mask) {\r
87         // Scan bits starting from left. Find first bit\r
88         for (int i=0; i<32; i++)\r
89             // Check if bit i is 1\r
90             if ((mask & (1<<i)) > 0) return i;\r
91         return 0;\r
92     }\r
93 \r
94     public int getAlphaMask() {\r
95         return alphaMask;\r
96     }\r
97 \r
98     public int getAlphaShift() {\r
99         return 7-alphaHighBit;\r
100     }\r
101 \r
102     public int getAlphaDepth() {\r
103         return alphaHighBit-alphaLowBit+1;\r
104     }\r
105     \r
106     public int getAlphaHighBit() {\r
107         return alphaHighBit;\r
108     }\r
109     \r
110     public int getAlphaLowBit() {\r
111         return alphaLowBit;\r
112     }\r
113     \r
114     \r
115     public int getBlueMask() {\r
116         return blueMask;\r
117     }\r
118 \r
119     public int getBlueShift() {\r
120         return 7- blueHighBit;\r
121     }\r
122 \r
123     public int getBlueDepth() {\r
124         return blueHighBit-blueLowBit+1;\r
125     }\r
126     \r
127     public int getBlueHighBit() {\r
128         return blueHighBit;\r
129     }\r
130     \r
131     public int getBlueLowBit() {\r
132         return blueLowBit;\r
133     }\r
134 \r
135     \r
136     public int getGreenMask() {\r
137         return greenMask;\r
138     }\r
139 \r
140     public int getGreenShift() {\r
141         return 7-greenHighBit;\r
142     }\r
143 \r
144     public int getGreenDepth() {\r
145         return greenHighBit-greenLowBit+1;\r
146     }\r
147     \r
148     public int getGreenHighBit() {\r
149         return greenHighBit;\r
150     }\r
151     \r
152     public int getGreenLowBit() {\r
153         return greenLowBit;\r
154     }\r
155 \r
156     public int getRedMask() {\r
157         return redMask;\r
158     }\r
159     \r
160     public int getRedShift() {\r
161         return 7-redHighBit;\r
162     }\r
163 \r
164     public int getRedDepth() {\r
165         return redHighBit-redLowBit+1;\r
166     }\r
167     \r
168     public int getRedHighBit() {\r
169         return redHighBit;\r
170     }\r
171     \r
172     public int getRedLowBit() {\r
173         return redLowBit;\r
174     }\r
175     \r
176     public int getBitDepth() {\r
177         return bitDepth; \r
178     }\r
179     \r
180     public int getNumberOfColorComponents() {\r
181         int result = 0;\r
182         if (redMask>0) result++;\r
183         if (greenMask>0) result++;\r
184         if (blueMask>0) result++;\r
185         if (alphaMask>0) result++;\r
186         return result;\r
187     }\r
188     \r
189     \r
190     /**\r
191      * Return pixel size in bytes\r
192      * @return pixel size in bytes\r
193      */\r
194     public int getPixelSize() {\r
195         return (bitDepth+7)/8; \r
196     }\r
197     \r
198     @Override\r
199     public int hashCode() {\r
200         return (redLowBit)|(redHighBit<<4)|(greenLowBit<<8)|(greenHighBit<<12)|(blueLowBit<<16)|(blueHighBit<<20)|(alphaLowBit<<24)|(alphaHighBit<<28); \r
201     }\r
202     \r
203     @Override\r
204     public boolean equals(Object o2) {\r
205         if (!o2.getClass().equals(this.getClass())) return false;\r
206         PixelFormat pf2 = (PixelFormat) o2;\r
207         return (redMask == pf2.redMask) && (greenMask == pf2.greenMask) && (blueMask == pf2.blueMask) && (alphaMask == pf2.alphaMask);\r
208     }    \r
209     \r
210     @Override\r
211     public String toString() {\r
212         return bitDepth+" bits";\r
213     }\r
214     \r
215 //    public void saveState(IMemento memento)\r
216 //    {   \r
217 //        memento.putInteger("redMask", redMask);\r
218 //        memento.putInteger("greenMask", greenMask);\r
219 //        memento.putInteger("blueMask", blueMask);\r
220 //        memento.putInteger("alphaMask", alphaMask);\r
221 //    }\r
222 //    \r
223 //    public static PixelFormat restoreState(IMemento memento)\r
224 //    {\r
225 //        return new PixelFormat(\r
226 //                memento.getInteger("redMask"),\r
227 //                memento.getInteger("greenMask"),\r
228 //                memento.getInteger("blueMask"),\r
229 //                memento.getInteger("alphaMask")\r
230 //                );\r
231 //    }\r
232 }\r