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

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

#### 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
133.                 Else If ( g > b )
134.                         dif = b-r
135.                         mx = g
137.                 Else
138.                         dif = r-g
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.
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

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]