HLSColor.cs
上传用户:hbhltzc
上传日期:2022-06-04
资源大小:1925k
文件大小:8k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. using System;
  2. using System.Drawing;
  3. namespace XmlNotepad {
  4.     /// <include file='docControlPaint.uex' path='docs/doc[@for="ControlPaint.HLSColor"]/*' />
  5.     /// <devdoc>
  6.     ///     Logic copied from Win2K sources to copy the lightening and
  7.     ///     darkening of colors.
  8.     /// </devdoc>
  9.     public struct HLSColor {
  10.         private const int ShadowAdj         = -333;
  11.         private const int HilightAdj        = 500;
  12.         private const int WatermarkAdj      = -50;
  13.         private const int Range = 240;
  14.         private const int HLSMax = Range;
  15.         private const int RGBMax = 255;
  16.         private const int Undefined = HLSMax*2/3;
  17.         private int hue;
  18.         private int saturation;
  19.         private int luminosity;
  20.         /// <include file='docControlPaint.uex' path='docs/doc[@for="ControlPaint.HLSColor.HLSColor"]/*' />
  21.         /// <devdoc>
  22.         /// </devdoc>
  23.         public HLSColor(Color color) {
  24.             int r = color.R;
  25.             int g = color.G;
  26.             int b = color.B;
  27.             int max, min;        /* max and min RGB values */
  28.             int sum, dif;
  29.             int  Rdelta,Gdelta,Bdelta;  /* intermediate value: % of spread from max */
  30.             /* calculate lightness */
  31.             max = Math.Max( Math.Max(r,g), b);
  32.             min = Math.Min( Math.Min(r,g), b);
  33.             sum = max + min;
  34.             luminosity = (((sum * HLSMax) + RGBMax)/(2*RGBMax));
  35.             dif = max - min;
  36.             if (dif == 0) {       /* r=g=b --> achromatic case */
  37.                 saturation = 0;                         /* saturation */
  38.                 hue = Undefined;                 /* hue */
  39.             }
  40.             else {                           /* chromatic case */
  41.                 /* saturation */
  42.                 if (luminosity <= (HLSMax/2))
  43.                     saturation = (int) (((dif * (int) HLSMax) + (sum / 2) ) / sum);
  44.                 else
  45.                     saturation = (int) ((int) ((dif * (int) HLSMax) + (int)((2*RGBMax-sum)/2) )
  46.                         / (2*RGBMax-sum));
  47.                 /* hue */
  48.                 Rdelta = (int) (( ((max-r)*(int)(HLSMax/6)) + (dif / 2) ) / dif);
  49.                 Gdelta = (int) (( ((max-g)*(int)(HLSMax/6)) + (dif / 2) ) / dif);
  50.                 Bdelta = (int) (( ((max-b)*(int)(HLSMax/6)) + (dif / 2) ) / dif);
  51.                 if ((int) r == max)
  52.                     hue = Bdelta - Gdelta;
  53.                 else if ((int)g == max)
  54.                     hue = (HLSMax/3) + Rdelta - Bdelta;
  55.                 else /* B == cMax */
  56.                     hue = ((2*HLSMax)/3) + Gdelta - Rdelta;
  57.                 if (hue < 0)
  58.                     hue += HLSMax;
  59.                 if (hue > HLSMax)
  60.                     hue -= HLSMax;
  61.             }
  62.         }
  63.         /// <include file='docControlPaint.uex' path='docs/doc[@for="ControlPaint.HLSColor.Hue"]/*' />
  64.         /// <devdoc>
  65.         /// </devdoc>
  66.         public int Hue {
  67.             get {
  68.                 return hue;
  69.             }
  70.         }
  71.         /// <include file='docControlPaint.uex' path='docs/doc[@for="ControlPaint.HLSColor.Luminosity"]/*' />
  72.         /// <devdoc>
  73.         /// </devdoc>
  74.         public int Luminosity {
  75.             get {
  76.                 return luminosity;
  77.             }
  78.         }
  79.         /// <include file='docControlPaint.uex' path='docs/doc[@for="ControlPaint.HLSColor.Saturation"]/*' />
  80.         /// <devdoc>
  81.         /// </devdoc>
  82.         public int Saturation {
  83.             get {
  84.                 return saturation;
  85.             }
  86.         }
  87.         public Color Darker(float percDarker) {
  88.             int oneLum = 0;
  89.             int zeroLum = NewLuma(ShadowAdj, true);
  90.             return ColorFromHLS(hue, zeroLum - (int)((zeroLum - oneLum) * percDarker), saturation);
  91.         }
  92.         public static bool operator ==(HLSColor a, HLSColor b){
  93.             return a.Equals(b); 
  94.         }
  95.         public static bool operator !=(HLSColor a, HLSColor b) {
  96.             return !a.Equals(b);
  97.         }
  98.             
  99.         public override bool Equals(object o) {
  100.             if (!(o is HLSColor)) {
  101.                 return false;
  102.             }
  103.                 
  104.             HLSColor c = (HLSColor)o;
  105.             return hue == c.hue &&
  106.                 saturation == c.saturation &&
  107.                 luminosity == c.luminosity;
  108.         }
  109.         public override int GetHashCode() {
  110.             return hue << 6 | saturation << 2 | luminosity;
  111.         }
  112.     
  113.         public Color Lighter(float percLighter) {
  114.             int zeroLum = luminosity;
  115.             int oneLum = NewLuma(HilightAdj, true);
  116.             return ColorFromHLS(hue, zeroLum + (int)((oneLum - zeroLum) * percLighter), saturation);
  117.         }
  118.         private int NewLuma(int n, bool scale) {
  119.             return NewLuma(luminosity, n, scale);
  120.         }
  121.         private static int NewLuma(int luminosity, int n, bool scale) {
  122.             if (n == 0)
  123.                 return luminosity;
  124.             if (scale) {
  125.                 if (n > 0) {
  126.                     return(int)(((int)luminosity * (1000 - n) + (Range + 1L) * n) / 1000);
  127.                 }
  128.                 else {
  129.                     return(int)(((int)luminosity * (n + 1000)) / 1000);
  130.                 }
  131.             }
  132.             int newLum = luminosity;
  133.             newLum += (int)((long)n * Range / 1000);
  134.             if (newLum < 0)
  135.                 newLum = 0;
  136.             if (newLum > HLSMax)
  137.                 newLum = HLSMax;
  138.             return newLum;
  139.         }
  140.         /// <include file='docControlPaint.uex' path='docs/doc[@for="ControlPaint.HLSColor.ColorFromHLS"]/*' />
  141.         /// <devdoc>
  142.         /// </devdoc>
  143.         public static Color ColorFromHLS(int hue, int luminosity, int saturation) {
  144.             byte r,g,b;                      /* RGB component values */
  145.             int  magic1,magic2;       /* calculated magic numbers (really!) */
  146.             if (saturation == 0) {                /* achromatic case */
  147.                 r = g = b = (byte)((luminosity * RGBMax) / HLSMax);
  148.                 if (hue != Undefined) {
  149.                     /* ERROR */
  150.                 }
  151.             }
  152.             else {                         /* chromatic case */
  153.                 /* set up magic numbers */
  154.                 if (luminosity <= (HLSMax/2))
  155.                     magic2 = (int)((luminosity * ((int)HLSMax + saturation) + (HLSMax/2))/HLSMax);
  156.                 else
  157.                     magic2 = luminosity + saturation - (int)(((luminosity*saturation) + (int)(HLSMax/2))/HLSMax);
  158.                 magic1 = 2*luminosity-magic2;
  159.                 /* get RGB, change units from HLSMax to RGBMax */
  160.                 r = (byte)(((HueToRGB(magic1,magic2,(int)(hue+(int)(HLSMax/3)))*(int)RGBMax + (HLSMax/2))) / (int)HLSMax);
  161.                 g = (byte)(((HueToRGB(magic1,magic2,hue)*(int)RGBMax + (HLSMax/2))) / HLSMax);
  162.                 b = (byte)(((HueToRGB(magic1,magic2,(int)(hue-(int)(HLSMax/3)))*(int)RGBMax + (HLSMax/2))) / (int)HLSMax);
  163.             }
  164.             return Color.FromArgb(r,g,b);
  165.         }
  166.         /// <include file='docControlPaint.uex' path='docs/doc[@for="ControlPaint.HLSColor.HueToRGB"]/*' />
  167.         /// <devdoc>
  168.         /// </devdoc>
  169.         private static int HueToRGB(int n1, int n2, int hue) {
  170.             /* range check: note values passed add/subtract thirds of range */
  171.             /* The following is redundant for WORD (unsigned int) */
  172.             if (hue < 0)
  173.                 hue += HLSMax;
  174.             if (hue > HLSMax)
  175.                 hue -= HLSMax;
  176.             /* return r,g, or b value from this tridrant */
  177.             if (hue < (HLSMax/6))
  178.                 return( n1 + (((n2-n1)*hue+(HLSMax/12))/(HLSMax/6)) );
  179.             if (hue < (HLSMax/2))
  180.                 return( n2 );
  181.             if (hue < ((HLSMax*2)/3))
  182.                 return( n1 + (((n2-n1)*(((HLSMax*2)/3)-hue)+(HLSMax/12)) / (HLSMax/6)) );
  183.             else
  184.                 return( n1 );
  185.         }
  186.         public override string ToString() {
  187.             return this.hue + ", " + this.luminosity + ", " + this.saturation;
  188.         }
  189.     }
  190. }