color.bmx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. Strict
  2. Type TColor
  3. Method RGBColor:TRGBColor() Abstract
  4. Method CMYColor:TCMYColor() Abstract
  5. Method HSVColor:THSVColor() Abstract
  6. End Type
  7. Type TRGBColor Extends TColor
  8. Field _red#,_grn#,_blu#
  9. Method RGBColor:TRGBColor()
  10. Return Self
  11. End Method
  12. Method CMYColor:TCMYColor()
  13. Return TCMYColor.CreateCMY( 1-_red,1-_grn,1-_blu )
  14. End Method
  15. Method HSVColor:THSVColor()
  16. Local hmin#=_red
  17. If _grn<hmin hmin=_grn
  18. If _blu<hmin hmin=_blu
  19. Local hmax#=_red
  20. If _grn>hmax hmax=_grn
  21. If _blu>hmax hmax=_blu
  22. If hmax-hmin=0 Return THSVColor.CreateHSV( 0,0,hmax )
  23. Local hue#,delta#=hmax-hmin
  24. Select hmax
  25. Case _red hue=(_grn-_blu)/delta
  26. Case _grn hue=2+(_blu-_red)/delta
  27. Case _blu hue=4+(_red-_grn)/delta
  28. End Select
  29. hue=hue*60
  30. If hue<0 hue=hue+360
  31. Return THSVColor.CreateHSV( hue,delta/hmax,hmax )
  32. End Method
  33. Method RED#()
  34. Return _red
  35. End Method
  36. Method GREEN#()
  37. Return _grn
  38. End Method
  39. Method BLUE#()
  40. Return _blu
  41. End Method
  42. Method Set(r#,g#,b#)
  43. _red=r
  44. _grn=g
  45. _blu=b
  46. End Method
  47. Function CreateRGB:TRGBColor( RED#,grn#,blu# )
  48. Local color:TRGBColor=New TRGBColor
  49. color._red=RED
  50. color._grn=grn
  51. color._blu=blu
  52. Return color
  53. End Function
  54. End Type
  55. Type TCMYColor Extends TColor
  56. Field _cyn#,_mag#,_yel#
  57. Method RGBColor:TRGBColor()
  58. Return TRGBColor.CreateRGB( 1-_cyn,1-_mag,1-_yel )
  59. End Method
  60. Method CMYColor:TCMYColor()
  61. Return Self
  62. End Method
  63. Method HSVColor:THSVColor()
  64. Return RGBColor().HSVColor()
  65. End Method
  66. Method CYAN#()
  67. Return _cyn
  68. End Method
  69. Method MAGENTA#()
  70. Return _mag
  71. End Method
  72. Method YELLOW#()
  73. Return _yel
  74. End Method
  75. Function CreateCMY:TCMYColor( cyn#,mag#,yel# )
  76. Local color:TCMYColor=New TCMYColor
  77. color._cyn=cyn
  78. color._mag=mag
  79. color._yel=yel
  80. Return color
  81. End Function
  82. End Type
  83. Type THSVColor Extends TColor
  84. Field _hue#,_sat#,_val#
  85. Method RGBColor:TRGBColor()
  86. If _sat<=0 Return TRGBColor.CreateRGB( _val,_val,_val )
  87. Local h#=_hue/60
  88. Local i#=Floor( h )
  89. Local f#=h-i
  90. Local p#=_val*(1-_sat)
  91. Local q#=_val*(1-(_sat*f))
  92. Local t#=_val*(1-(_sat*(1-f)))
  93. Select Int(i)
  94. Case 0 Return TRGBColor.CreateRGB( _val,t,p )
  95. Case 1 Return TRGBColor.CreateRGB( q,_val,p )
  96. Case 2 Return TRGBColor.CreateRGB( p,_val,t )
  97. Case 3 Return TRGBColor.CreateRGB( p,q,_val )
  98. Case 4 Return TRGBColor.CreateRGB( t,p,_val )
  99. Case 5 Return TRGBColor.CreateRGB( _val,p,q )
  100. End Select
  101. End Method
  102. Method CMYColor:TCMYColor()
  103. Return RGBColor().CMYColor()
  104. End Method
  105. Method HSVColor:THSVColor()
  106. Return Self
  107. End Method
  108. Method Hue#()
  109. Return _hue
  110. End Method
  111. Method Saturation#()
  112. Return _sat
  113. End Method
  114. Method Value#()
  115. Return _val
  116. End Method
  117. Function CreateHSV:THSVColor( hue#,sat#,val# )
  118. If hue<0 hue=hue+360
  119. If hue>=360 hue=hue-360
  120. Local color:THSVColor=New THSVColor
  121. color._hue=hue
  122. color._sat=sat
  123. color._val=val
  124. Return color
  125. End Function
  126. End Type
  127. Global RED:TColor=RGBColor( 1,0,0 )
  128. Global GREEN:TColor=RGBColor( 0,1,0 )
  129. Global BLUE:TColor=RGBColor( 0,0,1 )
  130. Global ORANGE:TColor=RGBColor( 1,1,0 )
  131. Global CYAN:TColor=CMYColor( 1,0,0 )
  132. Global MAGENTA:TColor=CMYColor( 0,1,0 )
  133. Global YELLOW:TColor=CMYColor( 0,0,1 )
  134. Global BLACK:TColor=HSVColor( 0,0,0 )
  135. Global WHITE:TColor=HSVColor( 0,0,1 )
  136. Global GRAY:TColor=HSVColor( 0,0,.5 )
  137. Global DARKGRAY:TColor=HSVColor( 0,0,.25 )
  138. Global LIGHTGRAY:TColor=HSVColor( 0,0,.75 )
  139. Rem
  140. bbdoc: Create a red, green, blue color
  141. returns: A new color object
  142. about: @red, @grn and @blu should be in the range 0 to 1.
  143. End Rem
  144. Function RGBColor:TRGBColor( RED#,grn#,blu# )
  145. Return TRGBColor.CreateRGB( RED,grn,blu )
  146. End Function
  147. Rem
  148. bbdoc: Create a cyan, magenta, yellow color
  149. returns: A new color object
  150. about: @cyn, @mag and @yel should be in the range 0 to 1.
  151. End Rem
  152. Function CMYColor:TCMYColor( cyn#,mag#,yel# )
  153. Return TCMYColor.CreateCMY( cyn,mag,yel )
  154. End Function
  155. Rem
  156. bbdoc: Create a hue, saturation, value color
  157. returns: A new color object
  158. about: @hue should be in the range 0 to 360, @sat and @val should be in the range 0 to 1.
  159. End Rem
  160. Function HSVColor:THSVColor( hue#,sat#,val# )
  161. Return THSVColor.CreateHSV( hue,sat,val )
  162. End Function
  163. Rem
  164. bbdoc: Get red component of a color
  165. returns: Red component of @color in the range 0 to 1
  166. End Rem
  167. Function ColorRed#( color:TColor )
  168. Return color.RGBColor().RED()
  169. End Function
  170. Rem
  171. bbdoc: Get green component of a color
  172. returns: Green component of @color in the range 0 to 1
  173. End Rem
  174. Function ColorGreen#( color:TColor )
  175. Return color.RGBColor().GREEN()
  176. End Function
  177. Rem
  178. bbdoc: Get blue component of a color
  179. returns: Blue component of @color in the range 0 to 1
  180. End Rem
  181. Function ColorBlue#( color:TColor )
  182. Return color.RGBColor().BLUE()
  183. End Function
  184. Rem
  185. bbdoc: Get cyan component of a color
  186. returns: Cyan component of @color in the range 0 to 1
  187. End Rem
  188. Function ColorCyan#( color:TColor )
  189. Return color.CMYColor().CYAN()
  190. End Function
  191. Rem
  192. bbdoc: Get magenta component of a color
  193. returns: Magenta component of @color in the range 0 to 1
  194. End Rem
  195. Function ColorMagenta#( color:TColor )
  196. Return color.CMYColor().MAGENTA()
  197. End Function
  198. Rem
  199. bbdoc: Get yellow component of a color
  200. returns: Yellow component of @color in the range 0 to 1
  201. End Rem
  202. Function ColorYellow#( color:TColor )
  203. Return color.CMYColor().YELLOW()
  204. End Function
  205. Rem
  206. bbdoc: Get hue component of a color
  207. returns: Hue component of @color in the range 0 to 360
  208. End Rem
  209. Function ColorHue#( color:TColor )
  210. Return color.HSVColor().Hue()
  211. End Function
  212. Rem
  213. bbdoc: Get saturation component of a color
  214. returns: Saturation component of @color in the range 0 to 1
  215. End Rem
  216. Function ColorSaturation#( color:TColor )
  217. Return color.HSVColor().Saturation()
  218. End Function
  219. Rem
  220. bbdoc: Get value component of a color
  221. returns: Value component of @color in the range 0 to 1
  222. End Rem
  223. Function ColorValue#( color:TColor )
  224. Return color.HSVColor().Value()
  225. End Function