www.pudn.com > myXPButton_net.zip > tools.cpp


//tools.cpp 
#include "stdafx.h" 
#include "tools.h" 
/////////////////////////////////////////////////////////////////////////////// 
COLORREF HLS_TRANSFORM (COLORREF rgb, int percent_L, int percent_S) 
{ 
    HLSCOLOR hls = RGB2HLS (rgb); 
    BYTE h = HLS_H(hls); 
    BYTE l = HLS_L(hls); 
    BYTE s = HLS_S(hls); 
 
    if ( percent_L > 0 ) 
    { 
        l = BYTE(l + ((255 - l) * percent_L) / 100); 
    } 
    else if ( percent_L < 0 ) 
    { 
        l = BYTE((l * (100+percent_L)) / 100); 
    } 
    if ( percent_S > 0 ) 
    { 
        s = BYTE(s + ((255 - s) * percent_S) / 100); 
    } 
    else if ( percent_S < 0 ) 
    { 
        s = BYTE((s * (100+percent_S)) / 100); 
    } 
    return HLS2RGB (HLS(h, l, s)); 
} 
/////////////////////////////////////////////////////////////////////////////// 
COLORREF HLS2RGB (HLSCOLOR hls) 
{ 
    float hue        = ((int)HLS_H(hls)*360)/255.0f; 
    float luminance  = HLS_L(hls)/255.0f; 
    float saturation = HLS_S(hls)/255.0f; 
 
    if ( saturation == 0.0f ) 
    { 
        return RGB (HLS_L(hls), HLS_L(hls), HLS_L(hls)); 
    } 
    float rm1, rm2; 
      
    if ( luminance <= 0.5f ) rm2 = luminance + luminance * saturation;   
    else                     rm2 = luminance + saturation - luminance * saturation; 
    rm1 = 2.0f * luminance - rm2;    
    BYTE red   = _ToRGB (rm1, rm2, hue + 120.0f);    
    BYTE green = _ToRGB (rm1, rm2, hue); 
    BYTE blue  = _ToRGB (rm1, rm2, hue - 120.0f); 
 
    return RGB (red, green, blue); 
} 
/////////////////////////////////////////////////////////////////////////////// 
static BYTE _ToRGB (float rm1, float rm2, float rh) 
{ 
  if      (rh > 360.0f) rh -= 360.0f; 
  else if (rh <   0.0f) rh += 360.0f; 
  
  if      (rh <  60.0f) rm1 = rm1 + (rm2 - rm1) * rh / 60.0f;    
  else if (rh < 180.0f) rm1 = rm2; 
  else if (rh < 240.0f) rm1 = rm1 + (rm2 - rm1) * (240.0f - rh) / 60.0f;       
                    
  return (BYTE)(rm1 * 255); 
} 
/////////////////////////////////////////////////////////////////////////////// 
HLSCOLOR RGB2HLS (COLORREF rgb) 
{ 
    unsigned char minval = min(GetRValue(rgb), min(GetGValue(rgb), GetBValue(rgb))); 
    unsigned char maxval = max(GetRValue(rgb), max(GetGValue(rgb), GetBValue(rgb))); 
    float mdiff  = float(maxval) - float(minval); 
    float msum   = float(maxval) + float(minval); 
    
    float luminance = msum / 510.0f; 
    float saturation = 0.0f; 
    float hue = 0.0f;  
 
    if ( maxval != minval ) 
    {  
        float rnorm = (maxval - GetRValue(rgb)  ) / mdiff;       
        float gnorm = (maxval - GetGValue(rgb)) / mdiff; 
        float bnorm = (maxval - GetBValue(rgb) ) / mdiff;    
 
        saturation = (luminance <= 0.5f) ? (mdiff / msum) : (mdiff / (510.0f - msum)); 
 
        if (GetRValue(rgb) == maxval) hue = 60.0f * (6.0f + bnorm - gnorm); 
        if (GetGValue(rgb) == maxval) hue = 60.0f * (2.0f + rnorm - bnorm); 
        if (GetBValue(rgb) == maxval) hue = 60.0f * (4.0f + gnorm - rnorm); 
        if (hue > 360.0f) hue = hue - 360.0f; 
    } 
    return HLS ((hue*255)/360, luminance*255, saturation*255); 
}