qimageblitz
inlinehsv.h
Go to the documentation of this file.00001 #ifndef __PIXIE_INLINEHSV_H
00002 #define __PIXIE_INLINEHSV_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <QColor>
00031
00042 class InlineHSV
00043 {
00044 public:
00045 InlineHSV(){;}
00051 inline void convertRGB2HSV(unsigned int rgb);
00052 inline void convertRGB2HSV(int red, int green, int blue);
00058 inline void convertHSV2RGB(int hue, int saturation, int value);
00062 inline void convertHSV2RGB();
00063
00064 inline void setHSV(int hue, int saturation, int value)
00065 {h = hue; s = saturation; v = value;}
00066 inline void setHue(int hue){h = hue;}
00067 inline void setSaturation(int saturation){s = saturation;}
00068 inline void setValue(int value){v = value;}
00069 inline int hue(){return(h);}
00070 inline int saturation(){return(s);}
00071 inline int value(){return(v);}
00072
00073 inline void setRGB(int red, int green, int blue)
00074 {r = red; g = green; b=blue;}
00075 inline void setRed(int red){r = red;}
00076 inline void setGreen(int green){g = green;}
00077 inline void setBlue(int blue){b = blue;}
00078 inline int red(){return(r);}
00079 inline int green(){return(g);}
00080 inline int blue(){return(b);}
00081 private:
00082 int h, s, v;
00083 int r, g, b;
00084 int max, whatmax, min, delta;
00085 unsigned int f, p, q, t;
00086 };
00087
00088 inline void InlineHSV::convertRGB2HSV(unsigned int pixel)
00089 {
00090 convertRGB2HSV(qRed(pixel), qGreen(pixel), qBlue(pixel));
00091 }
00092
00093 inline void InlineHSV::convertRGB2HSV(int red, int green, int blue)
00094 {
00095 r = red; g = green; b = blue;
00096 h = 0;
00097 max = r;
00098 whatmax = 0;
00099 if(g > max) { max = g; whatmax = 1; }
00100 if(b > max) { max = b; whatmax = 2; }
00101 min = r;
00102 if(g < min) min = g;
00103 if(b < min) min = b;
00104 delta = max-min;
00105 v = max;
00106 s = max ? (510*delta+max)/(2*max) : 0;
00107 if(s == 0)
00108 h = -1;
00109 else{
00110 switch(whatmax){
00111 case 0:
00112 h = (g >= b) ? (120*(g-b)+delta)/(2*delta) :
00113 (120*(g-b+delta)+delta)/(2*delta) + 300;
00114 break;
00115 case 1:
00116 h = (b > r) ? h = 120 + (120*(b-r)+delta)/(2*delta) :
00117 60 + (120*(b-r+delta)+delta)/(2*delta);
00118 break;
00119 case 2:
00120 h = (r > g) ? h = 240 + (120*(r-g)+delta)/(2*delta) :
00121 h = 180 + (120*(r-g+delta)+delta)/(2*delta);
00122 break;
00123 }
00124 }
00125 }
00126
00127 inline void InlineHSV::convertHSV2RGB(int hue, int saturation, int value)
00128 {
00129 h = hue; s = saturation; v = value;
00130 convertHSV2RGB();
00131 }
00132
00133 inline void InlineHSV::convertHSV2RGB()
00134 {
00135 if(h < -1 || s > 255 || v > 255)
00136 return;
00137
00138 r = g = b = v;
00139 if(s > 0 && h != -1){
00140 if(h >= 360) h %= 360;
00141 f = h%60;
00142 h /= 60;
00143 p = (2*v*(255-s)+255)/510;
00144 if(h&1){
00145 q = (2*v*(15300-s*f)+15300)/30600;
00146 switch( h ) {
00147 case 1: r=q; g=v, b=p; break;
00148 case 3: r=p; g=q, b=v; break;
00149 case 5: r=v; g=p, b=q; break;
00150 }
00151 } else {
00152 t = (2*v*(15300-(s*(60-f)))+15300)/30600;
00153 switch( h ) {
00154 case 0: r=v; g=t, b=p; break;
00155 case 2: r=p; g=v, b=t; break;
00156 case 4: r=t; g=p, b=v; break;
00157 }
00158 }
00159 }
00160 }
00161
00162 #endif
00163