color.monkey2 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. Namespace std.graphics
  2. using std.geom
  3. #rem monkeydoc The Color type provides support for manipulating red, green blue, alpha colors.
  4. #end
  5. Struct Color
  6. #rem monkeydoc Transparent black.
  7. #end
  8. Const None:=New Color( 0,0,0,0 )
  9. #rem monkeydoc Black.
  10. #end
  11. Const Black:=New Color( 0,0,0 )
  12. #rem monkeydoc Grey.
  13. #end
  14. Const Grey:=New Color( .5,.5,.5 )
  15. #rem monkeydoc Light Grey.
  16. #end
  17. Const LightGrey:=New Color( .75,.75,.75 )
  18. #rem monkeydoc Dark Grey.
  19. #end
  20. Const DarkGrey:=New Color( .25,.25,.25 )
  21. #rem monkeydoc White.
  22. #end
  23. Const White:=New Color( 1,1,1 )
  24. #rem monkeydoc Red.
  25. #end
  26. Const Red:=New Color( 1,0,0 )
  27. #rem monkeydoc Green.
  28. #end
  29. Const Green:=New Color( 0,1,0 )
  30. #rem monkeydoc Blue.
  31. #end
  32. Const Blue:=New Color( 0,0,1 )
  33. #rem monkeydoc Brown.
  34. #end
  35. Const Brown:=New Color( .7,.4,.1 )
  36. #rem monkeydoc Orange.
  37. #end
  38. Const Orange:=New Color( 1,.5,0 )
  39. #rem monkeydoc Yellow.
  40. #end
  41. Const Yellow:=New Color( 1,1,0 )
  42. #rem monkeydoc Lime.
  43. #end
  44. Const Lime:=New Color( .7,1,0 )
  45. #rem monkeydoc Pine.
  46. #end
  47. Const Pine:=New Color( 0,.5,0 )
  48. #rem monkeydoc Aqua.
  49. #end
  50. Const Aqua:=New Color( 0,.9,.4 )
  51. #rem monkeydoc Cyan.
  52. #end
  53. Const Cyan:=New Color( 0,1,1 )
  54. #rem monkeydoc Sky.
  55. #end
  56. Const Sky:=New Color( 0,.5,1 )
  57. #rem monkeydoc Steel.
  58. #end
  59. Const Steel:=New Color( .2,.2,.7 )
  60. #rem monkeydoc Violet.
  61. #end
  62. Const Violet:=New Color( .7,0,1 )
  63. #rem monkeydoc Magenta.
  64. #end
  65. Const Magenta:=New Color( 1,0,1 )
  66. #rem monkeydoc Puce.
  67. #end
  68. Const Puce:=New Color( 1,0,.4 )
  69. #rem monkeydoc Skin.
  70. #end
  71. Const Skin:=New Color( .8,.5,.6 )
  72. #rem monkeydoc Pink.
  73. #end
  74. Const Pink:=New Color( 1,.75,.8 )
  75. #rem monkeydoc HotPink.
  76. #end
  77. Const HotPink:=New Color( 1,.41,.71 )
  78. #rem monkeydoc SeaGreen.
  79. #end
  80. Const SeaGreen:=New Color( .031372,.301960,.247058,1 )
  81. #rem monkeydoc Silver.
  82. #end
  83. Const Silver:=New Color( 0.98695202723239916,0.98157612499486091,0.96058105436290453 )
  84. #rem monkeydoc Aluminum.
  85. #end
  86. Const Aluminum:=New Color( 0.95955910300613745,0.9635188914336692,0.96495768667887971 )
  87. #rem monkeydoc Gold.
  88. #end
  89. Const Gold:=New Color( 1,0.88565078560356991,0.6091625017721024 )
  90. #rem monkeydoc Copper.
  91. #end
  92. Const Copper:=New Color( 0.9792921449434141,0.81490079942355442,0.75455014940288267 )
  93. #rem monkeydoc Chromium.
  94. #end
  95. Const Chromium:=New Color( 0.76178782381338439,0.76588820797089974,0.76472402871006473 )
  96. #rem monkeydoc Nickel.
  97. #end
  98. Const Nickel:=New Color( 0.827766413700323,0.79798492878548577,0.74652364685504802 )
  99. #rem monkeydoc Titanium.
  100. #end
  101. Const Titanium:=New Color( 0.75694694835172049,0.72760746687141564,0.69520723368860826 )
  102. #rem monkeydoc Cobalt.
  103. #end
  104. Const Cobalt:=New Color( 0.82910355988659823,0.82495893307721546,0.81275025476652396 )
  105. #rem monkeydoc Platinum.
  106. #end
  107. Const Platinum:=New Color( 0.83493408973507777,0.81484503266020314,0.78399912482207756 )
  108. #rem monkeydoc Red component of color.
  109. #end
  110. Field r:Float
  111. #rem monkeydoc Green component of color.
  112. #end
  113. Field g:Float
  114. #rem monkeydoc Blue component of color.
  115. #end
  116. Field b:Float
  117. #rem monkeydoc Alpha component of color.
  118. #end
  119. Field a:Float
  120. #rem monkeydoc Creates a new color.
  121. #end
  122. Method New( a:Float=1 )
  123. Self.a=a
  124. End
  125. Method New( i:Float,a:Float=1 )
  126. Self.r=i
  127. Self.g=i
  128. Self.b=i
  129. Self.a=1
  130. End
  131. Method New( r:Float,g:Float,b:Float,a:Float=1 )
  132. Self.r=r
  133. Self.g=g
  134. Self.b=b
  135. Self.a=a
  136. End
  137. Method New( v:geom.Vec4f )
  138. Self.r=v.x
  139. Self.g=v.y
  140. Self.b=v.z
  141. Self.a=v.w
  142. End
  143. #rem monkeydoc Converts the color to a printable string.
  144. #end
  145. Operator To:String()
  146. Return "Color("+r+","+g+","+b+","+a+")"
  147. End
  148. #rem monkeydoc Converts the color to float 4 vector.
  149. #end
  150. Operator To:geom.Vec4f()
  151. Return New Vec4f( r,g,b,a )
  152. End
  153. #rem monkeydoc The Red color component.
  154. #end
  155. Property R:Float()
  156. Return r
  157. Setter( r:Float )
  158. Self.r=r
  159. End
  160. #rem monkeydoc The green color component.
  161. #end
  162. Property G:Float()
  163. Return g
  164. Setter( g:Float )
  165. Self.g=g
  166. End
  167. #rem monkeydoc The blue color component.
  168. #end
  169. Property B:Float()
  170. Return b
  171. Setter( b:Float )
  172. Self.b=b
  173. End
  174. #rem monkeydoc The alpha color component.
  175. #end
  176. Property A:Float()
  177. Return a
  178. Setter( a:Float )
  179. Self.a=a
  180. End
  181. #rem monkeydoc Multiplies the color by another color or value and returns the result.
  182. #end
  183. Operator*:Color( color:Color )
  184. Return New Color( r*color.r,g*color.g,b*color.b,a*color.a )
  185. End
  186. Operator*:Color( scale:Float )
  187. Return New Color( r*scale,g*scale,b*scale,a*scale )
  188. End
  189. #rem monkeydoc Divides the color by another color or value and returns the result.
  190. #end
  191. Operator/:Color( color:Color )
  192. Return New Color( r/color.r,g/color.g,b/color.b,a/color.a )
  193. End
  194. Operator/:Color( scale:Float )
  195. Return New Color( r/scale,g/scale,b/scale,a/scale )
  196. End
  197. #rem monkeydoc Adds another color or value to the color and returns the result.
  198. #end
  199. Operator+:Color( color:Color )
  200. Return New Color( r+color.r,g+color.g,b+color.b,a+color.a )
  201. End
  202. Operator+:Color( offset:Float )
  203. Return New Color( r+offset,g+offset,b+offset,a+offset )
  204. End
  205. #rem monkeydoc Subtracts another color or value from the color and returns the result.
  206. #end
  207. Operator-:Color( color:Color )
  208. Return New Color( r-color.r,g-color.g,b-color.b,a-color.a )
  209. End
  210. Operator-:Color( offset:Float )
  211. Return New Color( r-offset,g-offset,b-offset,a-offset )
  212. End
  213. #rem monkeydoc Blends the color with another color and returns the result.
  214. #end
  215. Method Blend:Color( color:Color,delta:Float )
  216. Local idelta:=1-delta
  217. Return New Color( r*idelta+color.r*delta,g*idelta+color.g*delta,b*idelta+color.b*delta,a*idelta+color.a*delta )
  218. End
  219. #rem monkeydoc Converts the color to 32 bit ARGB format.
  220. #end
  221. Method ToARGB:UInt()
  222. Return UInt(a*255) Shl 24 | UInt(r*255) Shl 16 | UInt(g*255) Shl 8 | UInt(b*255)
  223. End
  224. #rem monkeydoc Converts the color to printable string.
  225. #end
  226. Method ToString:String()
  227. Return Self
  228. End
  229. #rem monkeydoc Creates a color from hue, saturation and value.
  230. #end
  231. Function FromHSV:Color( h:Float,s:Float,v:Float,a:Float=1 )
  232. h*=6
  233. Local f:=h-Floor( h )
  234. Local p:=v * ( 1 - s )
  235. Local q:=v * ( 1 - ( s * f ) )
  236. Local t:=v * ( 1 - ( s * ( 1-f ) ) )
  237. Local r:Float,g:Float,b:Float
  238. Select Int( h ) Mod 6
  239. Case 0 r=v ; g=t ; b=p
  240. Case 1 r=q ; g=v ; b=p
  241. Case 2 r=p ; g=v ; b=t
  242. Case 3 r=p ; g=q ; b=v
  243. Case 4 r=t ; g=p ; b=v
  244. Case 5 r=v ; g=p ; b=q
  245. End
  246. Return New Color( r,g,b,a )
  247. End
  248. #rem monkeydoc Creates a color from a 32 bit ARGB color.
  249. #end
  250. Function FromARGB:Color( argb:UInt )
  251. Local a:=(argb Shr 24 & $ff)/255.0
  252. Local r:=(argb Shr 16 & $ff)/255.0
  253. Local g:=(argb Shr 8 & $ff)/255.0
  254. Local b:=(argb & $ff)/255.0
  255. Return New Color( r,g,b,a )
  256. End
  257. #rem monkeydoc Creates a random color.
  258. #end
  259. Function Rnd:Color()
  260. Return FromHSV( random.Rnd(6),1,1 )
  261. End
  262. End