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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.utils.ui.gfx;
\r
14 //import org.eclipse.ui.IMemento;
\r
18 * @author Toni Kalajainen
\r
20 public final class PixelFormat {
\r
22 public static PixelFormat RGB24 = new PixelFormat(0xff, 0xff00, 0xff0000, 0);
\r
25 private final int redMask;
\r
27 private final int greenMask;
\r
29 private final int blueMask;
\r
31 private final int alphaMask;
\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
38 private final int redLowBit;
\r
39 private final int greenLowBit;
\r
40 private final int blueLowBit;
\r
41 private final int alphaLowBit;
\r
44 private final int bitDepth;
\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
52 this.redHighBit = findHighestBit(redMask);
\r
53 this.greenHighBit = findHighestBit(greenMask);
\r
54 this.blueHighBit = findHighestBit(blueMask);
\r
55 this.alphaHighBit = findHighestBit(alphaMask);
\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
62 this.bitDepth = findHighestBit(redMask|greenMask|blueMask|alphaMask)+1;
\r
65 public boolean hasAlpha() {
\r
66 return alphaMask != 0;
\r
70 * Calculates mask's bit shift value
\r
72 * @param mask color mask
\r
74 static int calculateShiftFromMask(int mask) {
\r
75 return 7-findHighestBit(mask);
\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
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
94 public int getAlphaMask() {
\r
98 public int getAlphaShift() {
\r
99 return 7-alphaHighBit;
\r
102 public int getAlphaDepth() {
\r
103 return alphaHighBit-alphaLowBit+1;
\r
106 public int getAlphaHighBit() {
\r
107 return alphaHighBit;
\r
110 public int getAlphaLowBit() {
\r
111 return alphaLowBit;
\r
115 public int getBlueMask() {
\r
119 public int getBlueShift() {
\r
120 return 7- blueHighBit;
\r
123 public int getBlueDepth() {
\r
124 return blueHighBit-blueLowBit+1;
\r
127 public int getBlueHighBit() {
\r
128 return blueHighBit;
\r
131 public int getBlueLowBit() {
\r
136 public int getGreenMask() {
\r
140 public int getGreenShift() {
\r
141 return 7-greenHighBit;
\r
144 public int getGreenDepth() {
\r
145 return greenHighBit-greenLowBit+1;
\r
148 public int getGreenHighBit() {
\r
149 return greenHighBit;
\r
152 public int getGreenLowBit() {
\r
153 return greenLowBit;
\r
156 public int getRedMask() {
\r
160 public int getRedShift() {
\r
161 return 7-redHighBit;
\r
164 public int getRedDepth() {
\r
165 return redHighBit-redLowBit+1;
\r
168 public int getRedHighBit() {
\r
172 public int getRedLowBit() {
\r
176 public int getBitDepth() {
\r
180 public int getNumberOfColorComponents() {
\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
191 * Return pixel size in bytes
\r
192 * @return pixel size in bytes
\r
194 public int getPixelSize() {
\r
195 return (bitDepth+7)/8;
\r
199 public int hashCode() {
\r
200 return (redLowBit)|(redHighBit<<4)|(greenLowBit<<8)|(greenHighBit<<12)|(blueLowBit<<16)|(blueHighBit<<20)|(alphaLowBit<<24)|(alphaHighBit<<28);
\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
211 public String toString() {
\r
212 return bitDepth+" bits";
\r
215 // public void saveState(IMemento memento)
\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
223 // public static PixelFormat restoreState(IMemento memento)
\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