00001
00002 #ifndef header_colormap
00003 #define header_colormap
00004
00005 #include "API/Display/Display/target.h"
00006
00007 class CL_ColorMap
00008 {
00009 public:
00010 CL_ColorMap(
00011 unsigned int red_mask,
00012 unsigned int green_mask,
00013 unsigned int blue_mask,
00014 unsigned int alpha_mask)
00015 {
00016 init(red_mask, green_mask, blue_mask, alpha_mask);
00017 }
00018
00019 CL_ColorMap(CL_Target *target)
00020 {
00021 init(
00022 target->get_red_mask(),
00023 target->get_green_mask(),
00024 target->get_blue_mask(),
00025 target->get_alpha_mask());
00026 }
00027
00028 unsigned int calc_color(float r, float g, float b, float a)
00029 {
00030
00031 if (r>1) r=1; if (g>1) g=1;
00032 if (b>1) b=1; if (a>1) a=1;
00033 if (r<0) r=0; if (g<0) g=0;
00034 if (b<0) b=0; if (a<0) a=0;
00035
00036 unsigned int red = (unsigned int) (r*((1<<m_red_length)-1)+0.5);
00037 unsigned int green = (unsigned int) (g*((1<<m_green_length)-1)+0.5);
00038 unsigned int blue = (unsigned int) (b*((1<<m_blue_length)-1)+0.5);
00039 unsigned int alpha = (unsigned int) (a*((1<<m_alpha_length)-1)+0.5);
00040
00041 return
00042 (red<<m_red_start)+
00043 (green<<m_green_start)+
00044 (blue<<m_blue_start)+
00045 (alpha<<m_alpha_start);
00046 }
00047
00048 unsigned int m_red_length, m_red_start;
00049 unsigned int m_green_length, m_green_start;
00050 unsigned int m_blue_length, m_blue_start;
00051 unsigned int m_alpha_length, m_alpha_start;
00052 private:
00053
00054 void init(
00055 unsigned int red_mask,
00056 unsigned int green_mask,
00057 unsigned int blue_mask,
00058 unsigned int alpha_mask)
00059 {
00060 m_red_start = start_bit(red_mask);
00061 m_green_start = start_bit(green_mask);
00062 m_blue_start = start_bit(blue_mask);
00063 m_alpha_start = start_bit(alpha_mask);
00064
00065 m_red_length = length(red_mask, m_red_start);
00066 m_green_length = length(green_mask, m_green_start);
00067 m_blue_length = length(blue_mask, m_blue_start);
00068 m_alpha_length = length(alpha_mask, m_alpha_start);
00069 }
00070
00071 int start_bit(unsigned int mask)
00072 {
00073 if (mask == 0) return 0;
00074
00075 unsigned int bitval=1;
00076 unsigned int counter=0;
00077
00078 while ((bitval&mask)==0)
00079 {
00080 counter++;
00081 bitval = bitval << 1;
00082 }
00083
00084 return counter;
00085 }
00086
00087 int length(unsigned int mask, unsigned int start_bit)
00088 {
00089 if (mask == 0) return 0;
00090
00091 unsigned int bitval=1;
00092 unsigned int counter=0;
00093
00094 mask = mask >> start_bit;
00095
00096 while ((bitval&mask)!=0)
00097 {
00098 counter++;
00099 bitval = bitval << 1;
00100 }
00101
00102 return counter;
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112 };
00113
00114 #endif