/core/src/main/scala/org/sgine/Color.scala

https://code.google.com/p/sgine/ · Scala · 284 lines · 255 code · 26 blank · 3 comment · 21 complexity · c37d935608c87f6cddf095fee4ba5857 MD5 · raw file

  1. package org.sgine
  2. /**
  3. * @author Matt Hicks <mhicks@sgine.org>
  4. */
  5. trait Color extends EnumEntry[Color] {
  6. def red: Double
  7. def green: Double
  8. def blue: Double
  9. def alpha: Double
  10. def apply(index: Int) = index match {
  11. case 0 => red
  12. case 1 => green
  13. case 2 => blue
  14. case 3 => alpha
  15. case _ => throw new IndexOutOfBoundsException("Index %s is greater than Color bounds (3)".format(index))
  16. }
  17. def apply(color: Color): Color = apply(color.red, color.green, color.blue, color.alpha)
  18. def apply(red: Double = red, green: Double = green, blue: Double = blue, alpha: Double = alpha): Color
  19. def add(red: Double = 0.0, green: Double = 0.0, blue: Double = 0.0, alpha: Double = 0.0) = {
  20. apply(this.red + red, this.green + green, this.blue + blue, this.alpha + alpha)
  21. }
  22. def subtract(red: Double = 0.0, green: Double = 0.0, blue: Double = 0.0, alpha: Double = 0.0) = {
  23. apply(this.red - red, this.green - green, this.blue - blue, this.alpha - alpha)
  24. }
  25. def multiply(red: Double = 1.0, green: Double = 1.0, blue: Double = 1.0, alpha: Double = 1.0) = {
  26. apply(this.red * red, this.green * green, this.blue * blue, this.alpha * alpha)
  27. }
  28. def divide(red: Double = 1.0, green: Double = 1.0, blue: Double = 1.0, alpha: Double = 1.0) = {
  29. apply(this.red / red, this.green / green, this.blue / blue, this.alpha / alpha)
  30. }
  31. override def equals(that: Any) = that match {
  32. case color: Color => color.red == red && color.green == green && color.blue == blue && color.alpha == alpha
  33. case _ => false
  34. }
  35. override def toString = "Color(red=%s, green=%s, blue=%s, alpha=%s)".format(red, green, blue, alpha)
  36. }
  37. object Color extends Enumerated[Color] {
  38. val AliceBlue = immutable(0xfff0f8ff)
  39. val AntiqueWhite = immutable(0xfffaebd7)
  40. val Aquamarine = immutable(0xff7fffd4)
  41. val Azure = immutable(0xfff0fff)
  42. val Beige = immutable(0xfff5f5dc)
  43. val Bisque = immutable(0xffffe4c4)
  44. val Black = immutable(0xff000000)
  45. val BlanchedAlmond = immutable(0xffffebcd)
  46. val Blue = immutable(0xff0000ff)
  47. val BlueViolet = immutable(0xff8a2be2)
  48. val Brown = immutable(0xffa52a2a)
  49. val Burlywood = immutable(0xffdeb887)
  50. val CadetBlue = immutable(0xff5f9ea0)
  51. val Chartreuse = immutable(0xff7fff00)
  52. val Chocolate = immutable(0xffd2691e)
  53. val Coral = immutable(0xffff7f50)
  54. val CornflowerBlue = immutable(0xff6495ed)
  55. val Cornsilk = immutable(0xfffff8dc)
  56. val Cyan = immutable(0xff00cdcd)
  57. val DarkBlue = immutable(0xff00008b)
  58. val DarkGoldenrod = immutable(0xffb8860b)
  59. val DarkGray = immutable(0xff3f3f3f)
  60. val DarkGreen = immutable(0xff006400)
  61. val DarkKhaki = immutable(0xffbdb76b)
  62. val DarkOliveGreen = immutable(0xff556b2f)
  63. val DarkOrange = immutable(0xffff8c00)
  64. val DarkOrchid = immutable(0xff9932cc)
  65. val DarkRed = immutable(0xff8b0000)
  66. val DarkSalmon = immutable(0xffe9967a)
  67. val DarkSeaGreen = immutable(0xff8fbc8f)
  68. val DarkSlateBlue = immutable(0xff483d8b)
  69. val DarkSlateGray = immutable(0xff2f4f4f)
  70. val DarkTurquoise = immutable(0xff00ced1)
  71. val DarkViolet = immutable(0xff9400d3)
  72. val DeepPink = immutable(0xffff1493)
  73. val DeepSkyBlue = immutable(0xff00bfff)
  74. val DimGray = immutable(0xff696969)
  75. val DodgerBlue = immutable(0xff1e90f)
  76. val Firebrick = immutable(0xffb22222)
  77. val FloralWhite = immutable(0xfffffaf0)
  78. val ForestGreen = immutable(0xff228b22)
  79. val Gainsboro = immutable(0xffdcdcdc)
  80. val GhostWhite = immutable(0xfff8f8ff)
  81. val Gold = immutable(0xffffd700)
  82. val Goldenrod = immutable(0xffdaa520)
  83. val Gray = immutable(0xffbebebe)
  84. val Green = immutable(0xff00ff00)
  85. val GreenYellow = immutable(0xffadff2f)
  86. val HaloBlue = immutable(0xff93a9b4)
  87. val HighlightBlue = immutable(0xffb2e1ff)
  88. val Honeydew = immutable(0xfff0ff0)
  89. val HotPink = immutable(0xffff69b4)
  90. val IndianRed = immutable(0xffcd5c5c)
  91. val Ivory = immutable(0xfffffff0)
  92. val Khaki = immutable(0xfff0e68c)
  93. val Lavender = immutable(0xffe6e6fa)
  94. val LavenderBlush = immutable(0xfffff05)
  95. val LawnGreen = immutable(0xff7cfc00)
  96. val LemonChiffon = immutable(0xfffffacd)
  97. val LightBlue = immutable(0xffadd8e6)
  98. val LightCoral = immutable(0xfff08080)
  99. val LightCyan = immutable(0xffe0fff)
  100. val LightGoldenrod = immutable(0xffeedd82)
  101. val LightGoldenrodYellow = immutable(0xfffafad2)
  102. val LightGray = immutable(0xffd3d3d3)
  103. val LightPink = immutable(0xffffb6c1)
  104. val LightSalmon = immutable(0xffffa07a)
  105. val LightSeaGreen = immutable(0xff20b2aa)
  106. val LightSkyBlue = immutable(0xff87cefa)
  107. val LightSlateBlue = immutable(0xff8470f)
  108. val LightSlateGray = immutable(0xff778899)
  109. val LightSteelBlue = immutable(0xffb0c4de)
  110. val LightYellow = immutable(0xffffffe0)
  111. val LimeGreen = immutable(0xff32cd32)
  112. val Linen = immutable(0xfffaf0e6)
  113. val Magenta = immutable(0xffff00ff)
  114. val Maroon = immutable(0xffb03060)
  115. val MediumAquamarine = immutable(0xff66cdaa)
  116. val MediumBlue = immutable(0xff0000cd)
  117. val MediumOrchid = immutable(0xffba55d3)
  118. val MediumPurple = immutable(0xff9370db)
  119. val MediumSeaGreen = immutable(0xff3cb371)
  120. val MediumSlateBlue = immutable(0xff7b68ee)
  121. val MediumSpringGreen = immutable(0xff00a9a)
  122. val MediumTurquoise = immutable(0xff48d1cc)
  123. val MediumVioletRed = immutable(0xffc71585)
  124. val MidnightBlue = immutable(0xff191970)
  125. val MintCream = immutable(0xfff5fffa)
  126. val MistyRose = immutable(0xffffe4e1)
  127. val Moccasin = immutable(0xffffe4b5)
  128. val NavajoWhite = immutable(0xffffdead)
  129. val NavyBlue = immutable(0xff000080)
  130. val OldLace = immutable(0xfffdf5e6)
  131. val OliveDrab = immutable(0xff6b8e23)
  132. val Orange = immutable(0xffffa500)
  133. val OrangeRed = immutable(0xffff4500)
  134. val Orchid = immutable(0xffda70d6)
  135. val PaleGoldenrod = immutable(0xffeee8aa)
  136. val PaleGreen = immutable(0xff98fb98)
  137. val PaleTurquoise = immutable(0xffafeeee)
  138. val PaleVioletRed = immutable(0xffdb7093)
  139. val PapayaWhip = immutable(0xffffefd5)
  140. val PeachPuff = immutable(0xffffdab9)
  141. val Peru = immutable(0xffcd853f)
  142. val Pink = immutable(0xffffc0cb)
  143. val Plum = immutable(0xffdda0dd)
  144. val PowderBlue = immutable(0xffb0e0e6)
  145. val Purple = immutable(0xffa0200)
  146. val Red = immutable(0xffff0000)
  147. val RosyBrown = immutable(0xffbc8f8f)
  148. val RoyalBlue = immutable(0xff4169e1)
  149. val SaddleBrown = immutable(0xff8b4513)
  150. val Salmon = immutable(0xfffa8072)
  151. val SandyBrown = immutable(0xfff4a460)
  152. val SeaGreen = immutable(0xff2e8b57)
  153. val Seashell = immutable(0xfffff5ee)
  154. val SelectBlue = immutable(0xff4394ff)
  155. val Sienna = immutable(0xffa0522d)
  156. val SkyBlue = immutable(0xff87ceeb)
  157. val SlateBlue = immutable(0xff6a5acd)
  158. val SlateGray = immutable(0xff708090)
  159. val Snow = immutable(0xfffffafa)
  160. val SpringGreen = immutable(0xff00f7f)
  161. val SteelBlue = immutable(0xff4682b4)
  162. val Tan = immutable(0xffd2b48c)
  163. val Thistle = immutable(0xffd8bfd8)
  164. val Tomato = immutable(0xffff6347)
  165. val Turquoise = immutable(0xff40e0d0)
  166. val UmmGold = immutable(0xffffcc33)
  167. val UmmMaroon = immutable(0xff660000)
  168. val Violet = immutable(0xffee82ee)
  169. val VioletRed = immutable(0xffd02090)
  170. val Wheat = immutable(0xfff5deb3)
  171. val White = immutable(0xffffffff)
  172. val WhiteSmoke = immutable(0xfff5f5f5)
  173. val Yellow = immutable(0xffffff00)
  174. val YellowGreen = immutable(0xff9acd32)
  175. val Clear = immutable(0x00fffff)
  176. def immutable(value: Long): ImmutableColor = {
  177. val alpha = (value >> 24 & 0xff) / 255.0
  178. val red = (value >> 16 & 0xff) / 255.0
  179. val green = (value >> 8 & 0xff) / 255.0
  180. val blue = (value >> 0 & 0xff) / 255.0
  181. immutable(red, green, blue, alpha)
  182. }
  183. def immutable(red: Int, green: Int, blue: Int, alpha: Int): ImmutableColor = {
  184. immutable(red / 255.0, green / 255.0, blue / 255.0, alpha / 255.0)
  185. }
  186. def immutable(hex: String): ImmutableColor = {
  187. val (red, green, blue, alpha) = convertHex(hex)
  188. new ImmutableColor(red, green, blue, alpha)
  189. }
  190. def immutable(red: Double = 0.0, green: Double = 0.0, blue: Double = 0.0, alpha: Double = 1.0): ImmutableColor = {
  191. ImmutableColor(red, green, blue, alpha)
  192. }
  193. def mutable(red: Double = 0.0, green: Double = 0.0, blue: Double = 0.0, alpha: Double = 1.0): MutableColor = {
  194. MutableColor(red, green, blue, alpha)
  195. }
  196. def mutable(value: Long): MutableColor = {
  197. val alpha = (value >> 24 & 0xff) / 255.0
  198. val red = (value >> 16 & 0xff) / 255.0
  199. val green = (value >> 8 & 0xff) / 255.0
  200. val blue = (value >> 0 & 0xff) / 255.0
  201. mutable(red, green, blue, alpha)
  202. }
  203. def mutable(red: Int, green: Int, blue: Int, alpha: Int): MutableColor = {
  204. mutable(red / 255.0, green / 255.0, blue / 255.0, alpha / 255.0)
  205. }
  206. def mutable(hex: String): MutableColor = {
  207. val (red, green, blue, alpha) = convertHex(hex)
  208. MutableColor(red, green, blue, alpha)
  209. }
  210. private def convertHex(hex: String): (Double, Double, Double, Double) = {
  211. if (hex.startsWith("#")) {
  212. convertHex(hex.substring(1))
  213. } else if ((hex.length == 3) || (hex.length == 4)) { // Convert 3-digit / 4-digit to 6-digit / 8-digit
  214. val b = new StringBuilder()
  215. for (i <- 0 until hex.length) {
  216. b.append(hex.charAt(i))
  217. b.append(hex.charAt(i))
  218. }
  219. convertHex(b.toString())
  220. } else if (hex.length >= 6) {
  221. val red = (fromHex(hex.charAt(0)) * 16) + fromHex(hex.charAt(1))
  222. val green = (fromHex(hex.charAt(2)) * 16) + fromHex(hex.charAt(3))
  223. val blue = (fromHex(hex.charAt(4)) * 16) + fromHex(hex.charAt(5))
  224. var alpha = 255
  225. if (hex.length == 8) {
  226. alpha = (fromHex(hex.charAt(6)) * 16) + fromHex(hex.charAt(7))
  227. }
  228. (red / 255.0, green / 255.0, blue / 255.0, alpha / 255.0)
  229. } else {
  230. throw new RuntimeException("Unable to parse " + hex + " to Color")
  231. }
  232. }
  233. private def fromHex(c: Char) = if (c.isDigit) {
  234. c.toString.toInt
  235. } else {
  236. c.toLower match {
  237. case 'a' => 10
  238. case 'b' => 11
  239. case 'c' => 12
  240. case 'd' => 13
  241. case 'e' => 14
  242. case 'f' => 15
  243. case _ => throw new RuntimeException("Unable to parse character to hex: " + c)
  244. }
  245. }
  246. }
  247. case class ImmutableColor(red: Double, green: Double, blue: Double, alpha: Double) extends Color {
  248. def apply(red: Double = red, green: Double = green, blue: Double = blue, alpha: Double = alpha) = {
  249. copy(red, green, blue, alpha)
  250. }
  251. def mutable = MutableColor(red, green, blue, alpha)
  252. }
  253. case class MutableColor(var red: Double, var green: Double, var blue: Double, var alpha: Double) extends Color {
  254. def apply(red: Double = red, green: Double = green, blue: Double = blue, alpha: Double = alpha) = {
  255. copy(red, green, blue, alpha)
  256. }
  257. def immutable = ImmutableColor(red, green, blue, alpha)
  258. }