Ooops
November 24, 2020, 06:51:58 AM

Author Topic: [bmx] Color Class by N [ 1+ years ago ]  (Read 890 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Color Class by N [ 1+ years ago ]
« on: June 29, 2017, 12:28:38 AM »
Title : Color Class
Author : N
Posted : 1+ years ago

Description : Internally, this is just RGBA, so if that's a problem, you might want to rewrite this as a class cluster instead.  That being said, this essentially just provides a small-ish, immutable class to work with colors in a few different formats.

Might be useful for something, I'm not sure, but it's some old code of mine that I modified a bit after finding it since I wasn't happy with some stuff in it.


Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Import Brl.Math
  4.  
  5. Private
  6.  
  7. ' 1 over 255
  8. Const b2f! = 0.003921568627450980392156862745098!
  9.  
  10. '#region Utility - Value clamping
  11. Function ClampD!( a!, b!, c! )
  12.         Return Min( Max( a, b ), c )
  13. End Function
  14. '#endregion
  15.  
  16. Public
  17.  
  18. Type TColor
  19.  
  20.         Field r!=0!, g!=0!, b!=0!, a!=0!
  21.  
  22.         '#region RGBA
  23.  
  24.         Function ForRGBA:TColor( r!, g!, b!, a! )
  25.                 Return New TColor.InitWithRGBA( r, g, b, a )
  26.         End Function
  27.        
  28.         Method InitWithIntComponents:TColor( r%, g%, b%, a% )
  29.                 Self.r = r*b2f
  30.                 Self.g = g*b2f
  31.                 Self.b = b*b2f
  32.                 Self.a = a*b2f
  33.                 Return Self
  34.         End Method
  35.        
  36.         Method InitWithRGBA:TColor( r!, g!, b!, a! )
  37.                 Self.r = r
  38.                 Self.g = g
  39.                 Self.b = b
  40.                 Self.a = a
  41.                 Return Self
  42.         End Method
  43.  
  44.         Method GetRGBA( r! Var, g! Var, b! Var, a! Var )
  45.                 r = Self.r
  46.                 g = Self.g
  47.                 b = Self.b
  48.                 a = Self.a
  49.         End Method
  50.        
  51.         Method GetRed!()
  52.                 Return r
  53.         End Method
  54.        
  55.         Method GetGreen!()
  56.                 Return g
  57.         End Method
  58.        
  59.         Method GetBlue!()
  60.                 Return b
  61.         End Method
  62.        
  63.         Method GetAlpha!()
  64.                 Return a
  65.         End Method
  66.  
  67.         Method ToInt%( )
  68.                 Local ir%, ig%, ib%, ia%
  69.                 ir = Min( Max( r*255, 0 ), 255 )
  70.                 ig = Min( Max( g*255, 0 ), 255 )
  71.                 ib = Min( Max( b*255, 0 ), 255 )
  72.                 ia = Min( Max( a*255, 0 ), 255 )
  73.                 Return ia Shl 24 | ir Shl 16 | ig Shl 8 | ib
  74.         End Method
  75.        
  76.         Method IntComponents(r% Var, g% Var, b% Var, a% Var)
  77.                 r = Self.r * 255
  78.                 g = Self.g * 255
  79.                 b = Self.b * 255
  80.                 a = Self.a * 255
  81.         End Method
  82.  
  83.         Function ForInt:TColor( rgba:Int )
  84.                 Return New TColor.InitWithRGBA( ..
  85.                         (rgba & 255)*b2f, ..
  86.                         (rgba Shr 8 & 255)*b2f, ..
  87.                         (rgba Shr 16 & 255)*b2f, ..
  88.                         (rgba Shr 24)*b2f )
  89.         End Function
  90.        
  91.         '#endregion
  92.  
  93.         '#region HSV
  94.  
  95.         Method InitWithHSV:TColor( h!, s!, v!, a!=1! )
  96.                 Local hi%, f!, p!, q!, t!
  97.                 f = h / 60!
  98.                 hi = Int(f) Mod 6
  99.                 f :- hi
  100.                 p = V*(1!-s)
  101.                 q = V*(1!-(f*s))
  102.                 t = V*(1!-((1!-f)*s))
  103.                 Select hi
  104.                         Case 0; r=V;    g=t;    b=p
  105.                         Case 1; r=q;    g=V;    b=p
  106.                         Case 2; r=p;    g=V;    b=t
  107.                         Case 3; r=p;    g=q;    b=V
  108.                         Case 4; r=t;    g=p;    b=V
  109.                         Case 5; r=V;    g=p;    b=q
  110.                 End Select
  111.                 Self.a = a
  112.                 Return Self
  113.         End Method
  114.  
  115.         Function ForHSV:TColor( h!, s!, v!, a!=1! )
  116.                 Return New TColor.InitWithHSV( h, s, v, a )
  117.         End Function
  118.  
  119.         Method ToHSV( h! Var, s! Var, v! Var )
  120.                 Local mn!, mx!, dif!, ad!, dv!, md!
  121.                 If ( r < g and r < b )
  122.                         mn = r
  123.                 Else If ( g < b )
  124.                         mn = g
  125.                 Else
  126.                         mn = b
  127.                 EndIf
  128.  
  129.                 If ( r > g and r > b )
  130.                         mx = r
  131.                         dif = g-b
  132.                         ad = 0!
  133.                 Else If ( g > b )
  134.                         dif = b-r
  135.                         mx = g
  136.                         ad = 120!
  137.                 Else
  138.                         dif = r-g
  139.                         ad = 240!
  140.                         mx = b
  141.                 EndIf
  142.                
  143.                 md = mx-mn
  144.  
  145.                 h = (60!*(dif / md))+ad
  146.                 s = md/mx
  147.                 V = mx
  148.         End Method
  149.        
  150.         Method GetHue!()
  151.                 Local h!,s!,v!
  152.                 ToHSV(h,s,v)
  153.                 Return h
  154.         End Method
  155.        
  156.         Method GetSaturation!()
  157.                 Local h!,s!,v!
  158.                 ToHSV(h,s,v)
  159.                 Return s
  160.         End Method
  161.        
  162.         Method GetValue!()
  163.                 Local h!,s!,v!
  164.                 ToHSV(h,s,v)
  165.                 Return v
  166.         End Method
  167.        
  168.         '#endregion
  169.        
  170.         '#region CMYK
  171.        
  172.         Method InitWithCMYK:TColor( c!, m!, y!, k!, a!=1! )
  173.                 Return Self.InitWithRGBA( ..
  174.                         1! - (c*(1!-k)+k), ..
  175.                         1! - (m*(1!-k)+k), ..
  176.                         1! - (y*(1!-k)+k), a )
  177.         End Method
  178.        
  179.         Function ForCMYK:TColor( c!, m!, y!, k!, a!=1! )
  180.                 Return New TColor.InitWithCMYK( c, m, y, k, a )
  181.         End Function
  182.  
  183.         Method ToCMYK( c! Var, m! Var, y! Var, k! Var )
  184.                 Local cmy![] = [1!-r, 1!-g, 1!-b]
  185.                 Local sm% = 0
  186.                
  187.                 If cmy[1] < cmy[0] And cmy[1] < cmy[2] Then
  188.                         sm = 1
  189.                 ElseIf cmy[2] < cmy[0] And cmy[2] < cmy[1] Then
  190.                         sm = 2
  191.                 EndIf
  192.                
  193.                 If cmy[sm] >= 1 Then
  194.                         c = 0!
  195.                         m = 0!
  196.                         y = 0!
  197.                         k = 1!
  198.                 Else
  199.                         k = cmy[sm]
  200.                         Local kd! = 1.0 / (1! - k)
  201.                         c = (cmy[0]-k)*kd
  202.                         m = (cmy[1]-k)*kd
  203.                         y = (cmy[2]-k)*kd
  204.                 EndIf
  205.         End Method
  206.        
  207.         Method GetCyan!()
  208.                 Local c!,m!,y!,k!
  209.                 ToCMYK(c,m,y,k)
  210.                 Return c
  211.         End Method
  212.        
  213.         Method GetMagenta!()
  214.                 Local c!,m!,y!,k!
  215.                 ToCMYK(c,m,y,k)
  216.                 Return m
  217.         End Method
  218.        
  219.         Method GetYellow!()
  220.                 Local c!,m!,y!,k!
  221.                 ToCMYK(c,m,y,k)
  222.                 Return y
  223.         End Method
  224.        
  225.         Method GetKey!()
  226.                 Local c!,m!,y!,k!
  227.                 ToCMYK(c,m,y,k)
  228.                 Return k
  229.         End Method
  230.        
  231.         '#endregion
  232.  
  233.         '#region Operations
  234.  
  235.         Method Multiply:TColor( m:TColor )
  236.                 Return New TColor.InitWithRGBA( r*m.r, g*m.g, b*m.b, a*m.a )
  237.         End Method
  238.  
  239.         Method Add:TColor( o:TColor )
  240.                 Return New TColor.InitWithRGBA( r+o.r, g+o.g, b+o.b, a+o.a )
  241.         End Method
  242.  
  243.         Method Subtract:TColor( o:TColor )
  244.                 Return New TColor.InitWithRGBA( r-o.r, g-o.g, b-o.b, a-o.a )
  245.         End Method
  246.        
  247.         Method Clamp:TColor( bot!, top! )
  248.                 Return New TColor.InitWithRGBA(..
  249.                         ClampD( r, bot, top ),..
  250.                         ClampD( g, bot, top ),..
  251.                         ClampD( b, bot, top ),..
  252.                         ClampD( a, bot, top ) )
  253.         End Method
  254.        
  255.         Method Scale:TColor( x! )
  256.                 Return New TColor.InitWithRGBA(r*x, g*x, b*x, a*x)
  257.         End Method
  258.        
  259.         Method Invert:TColor()
  260.                 Return New TColor.InitWithRGBA(1!-r, 1!-g, 1!-b, 1!-a)
  261.         End Method
  262.        
  263.         ' If no function is specified, default to linear interpolation
  264.         Method Interpolate:TColor( other:TColor, delta:Double, fn:Double(start:Double, finish:Double, delta:Double, context:Object)=Null, context:Object=Null )
  265.                 delta = ClampD(delta, 0!, 1!)
  266.                 If fn Then
  267.                         Return New TColor.InitWithRGBA( ..
  268.                                 fn(r, other.r, delta, context), ..
  269.                                 fn(g, other.g, delta, context), ..
  270.                                 fn(b, other.b, delta, context), ..
  271.                                 fn(a, other.a, delta, context) )
  272.                 EndIf
  273.                 Local invdelta:Double = (1.0! - delta)
  274.                 Return New TColor.InitWithRGBA( ..
  275.                         other.r*delta + r*invdelta, ..
  276.                         other.g*delta + g*invdelta, ..
  277.                         other.b*delta + b*invdelta, ..
  278.                         other.a*delta + a*invdelta)
  279.         End Method
  280.        
  281.         '#endregion
  282.  
  283.         '#region Colors
  284.  
  285.         Function White:TColor( ); Return New TColor.InitWithRGBA( 1!, 1!, 1!, 1! ); End Function
  286.         Function Red:TColor( ); Return New TColor.InitWithRGBA( 1!, 0!, 0!, 1! ); End Function
  287.         Function Green:TColor( ); Return New TColor.InitWithRGBA( 0!, .75!, 0!, 1! ); End Function
  288.         Function Blue:TColor( ); Return New TColor.InitWithRGBA( 0!, 0!, .75!, 1! ); End Function
  289.         Function Lime:TColor( ); Return New TColor.InitWithRGBA( .25!, 1!, 0!, 1! ); End Function
  290.         Function LightGreen:TColor( ); Return New TColor.InitWithRGBA( .4!, 1!, .4!, 1! ); End Function
  291.         Function Pink:TColor( ); Return New TColor.InitWithRGBA( 1!, .25!, .25!, 1! ); End Function
  292.         Function Purple:TColor( ); Return New TColor.InitWithRGBA( 1!, 0!, .5!, 1! ); End Function
  293.         Function Turqoise:TColor( ); Return New TColor.InitWithRGBA( 0!, 1!, 1!, 1! ); End Function
  294.         Function Grey:TColor( ); Return New TColor.InitWithRGBA( .5!, .5!, .5!, 1! ); End Function
  295.         Function Black:TColor( ); Return New TColor.InitWithRGBA( 0!, 0!, 0!, 1! ); End Function
  296.         Function Yellow:TColor( ); Return New TColor.InitWithRGBA( 1!, 1!, 0!, 1! ); End Function
  297.         Function LightBlue:TColor( ); Return New TColor.InitWithRGBA( .4!, .4!, 1!, 1! ); End Function
  298.         Function Maroon:TColor( ); Return New TColor.InitWithRGBA( .5!, 0!, 0!, 1! ); End Function
  299.         Function Orange:TColor( ); Return New TColor.InitWithRGBA( 1!, .55!, 0!, 1! ); End Function
  300.         Function Brown:TColor( ); Return New TColor.InitWithRGBA( .5!, .4!, 0!, 1! ); End Function
  301.         Function Clear:TColor( ); Return New TColor.InitWithRGBA( 1!, 1!, 1!, 0! ); End Function
  302.  
  303.         '#endregion
  304.        
  305.         Method ToString$()
  306.                 Return "#<TColor:0x"+Super.ToString()+" @r="+r+" @g="+g+" @b="+b+" @a="+a+">"
  307.         End Method
  308. End Type


Comments :


Jesse(Posted 1+ years ago)

 show off. :)I like it. I was going to include hsv in the one I made when I needed it. Now I am going to incorporate this one(yours) to my ARGB and take the credit for it. ;)here hsv to rgb and vice versa in case you or soemeone here find it usefull:
Code: [Select]

Function HSVtoRGB(h:Float, s:Float, v:Float, r:Float Var, g:Float Var, b:Float Var)
 
    Local i:Int
    Local f:Float, p:Float, q:Float, t:Float,hTemp:Float
 
    If s = 0.0 Or h = -1.0   ' s==0? Totally unsaturated = grey so R,G And B all equal value
      b= v
g= v
r= v
      Return
    EndIf
 
    hTemp = h/60.0
    i = Floor(hTemp)                ' which sector
    f = hTemp - i                   ' how far through sector
    p = v * ( 1 - s )
    q = v * ( 1 - s * f )
    t = v * ( 1 - s * ( 1 - f ) )
 
    Select i  
    Case 0
r = v
g = t
b = p
    Case 1
r = q
g = v
b = p
    Case 2
r = p
g = v
b = t
    Case 3
r = p
g = q
b = v
    Case 4
r = t
g = p
b = v
    Case 5
r = v
g = p
b = q
    End Select
End Function
 

'*************************************************************************
Function RGBtoHSV(r:Float, g:Float, b:Float, h:Float Var, s:Float Var, v:Float Var)
 
     Local mn:Float = r
Local mx:Float = r
     Int maxVal=0
 
     If g > mx
mx=g
maxVal=1
EndIf
     If b > mx
mx=b
maxVal=2
EndIf
     If g < mn mn=g
     If b < mn mn=b  
    delta:Float = mx - mn
 
    v = mx  
    If mx <> 0
      s = delta / mx  
    Else  
      s = 0
      h = 0
      Return
    EndIf
    If s=0.0
      h=-1
      Return
    Else
     
      Select maxVal
      Case 0
h = ( g - b ) / delta         ' yel < h < mag
      Case 1
h = 2 + ( b - r ) / delta     ' cyan < h < yel
      Case 2
h = 4 + ( r - g ) / delta     ' mag < h < cyan
      End Select
    End If
 
    h :* 60
    If h < 0 Then h :+ 360
End Function



N(Posted 1+ years ago)

 Added an interpolate method.  Takes a function to customize the interpolation, and a context object for that function if needed, otherwise defaults to linear interpolation. [/i]

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal