55 #include "ColorTranslator.hh"
72 glGetIntegerv( GL_RED_BITS, &red_bits_ );
73 glGetIntegerv( GL_GREEN_BITS, &green_bits_ );
74 glGetIntegerv( GL_BLUE_BITS, &blue_bits_ );
75 glGetIntegerv( GL_ALPHA_BITS, &alpha_bits_ );
77 if (red_bits_ > 8) red_bits_ = 8;
78 if (green_bits_ > 8) green_bits_ = 8;
79 if (blue_bits_ > 8) blue_bits_ = 8;
80 if (alpha_bits_ > 8) alpha_bits_ = 8;
82 red_mask_ = ((1 << red_bits_) - 1);
83 green_mask_ = ((1 << green_bits_) - 1);
84 blue_mask_ = ((1 << blue_bits_) - 1);
85 alpha_mask_ = ((1 << alpha_bits_) - 1);
87 red_shift_ = 8 - red_bits_;
88 green_shift_ = 8 - green_bits_;
89 blue_shift_ = 8 - blue_bits_;
90 alpha_shift_ = 8 - alpha_bits_;
92 red_round_ = 1 << (red_shift_ - 1);
93 green_round_ = 1 << (green_shift_ - 1);
94 blue_round_ = 1 << (blue_shift_ - 1);
95 alpha_round_ = 1 << (alpha_shift_ - 1);
109 unsigned char r, g, b, a;
110 unsigned int idx(_idx+1);
112 b = ((idx & blue_mask_) << blue_shift_) | blue_round_;
114 g = ((idx & green_mask_) << green_shift_) | green_round_;
116 r = ((idx & red_mask_) << red_shift_) | red_round_;
118 a = ((idx & alpha_mask_) << alpha_shift_) | alpha_round_;
122 return Vec4uc(r, g, b, a);
126 std::cerr <<
"Can't convert index " << _idx <<
" to RGBA\n";
127 return Vec4uc(0, 0, 0, 0);
142 result = _rgba[3] >> alpha_shift_;
143 result <<= red_bits_;
144 result = _rgba[0] >> red_shift_;
145 result <<= green_bits_;
146 result |= _rgba[1] >> green_shift_;
147 result <<= blue_bits_;
148 result |= _rgba[2] >> blue_shift_;
161 if (red_bits_+green_bits_+blue_bits_+alpha_bits_ == 32)
164 return (1 << (red_bits_+green_bits_+blue_bits_+alpha_bits_))-1;