/modules/Canvas/lib/CanvasGradient.js

http://github.com/mschwartz/SilkJS · JavaScript · 294 lines · 269 code · 17 blank · 8 comment · 17 complexity · 046b2b74d165cf6620da871a749cb4d5 MD5 · raw file

  1. /** @ignore */
  2. "use strict";
  3. var cairo = require('builtin/cairo'),
  4. console = require('console');
  5. var namedColors = [
  6. // name RRGGBBAA
  7. "transparent", 'ffffff00',
  8. "aliceblue", 'f0f8ffff',
  9. "antiquewhite", 'faebd7ff',
  10. "aqua", '00ffffff',
  11. "aquamarine", '7fffd4ff',
  12. "azure", 'f0ffffff',
  13. "beige", 'f5f5dcff',
  14. "bisque", 'ffe4c4ff',
  15. "black", '000000ff',
  16. "blanchedalmond", 'ffebcdff',
  17. "blue", '0000ffff',
  18. "blueviolet", '8a2be2ff',
  19. "brown", 'a52a2aff',
  20. "burlywood", 'deb887ff',
  21. "cadetblue", '5f9ea0ff',
  22. "chartreuse", '7fff00ff',
  23. "chocolate", 'd2691eff',
  24. "coral", 'ff7f50ff',
  25. "cornflowerblue", '6495edff',
  26. "cornsilk", 'fff8dcff',
  27. "crimson", 'dc143cff',
  28. "cyan", '00ffffff',
  29. "darkblue", '00008bff',
  30. "darkcyan", '008b8bff',
  31. "darkgoldenrod", 'b8860bff',
  32. "darkgray", 'a9a9a9ff',
  33. "darkgreen", '006400ff',
  34. "darkgrey", 'a9a9a9ff',
  35. "darkkhaki", 'bdb76bff',
  36. "darkmagenta", '8b008bff',
  37. "darkolivegreen", '556b2fff',
  38. "darkorange", 'ff8c00ff',
  39. "darkorchid", '9932ccff',
  40. "darkred", '8b0000ff',
  41. "darksalmon", 'e9967aff',
  42. "darkseagreen", '8fbc8fff',
  43. "darkslateblue", '483d8bff',
  44. "darkslategray", '2f4f4fff',
  45. "darkslategrey", '2f4f4fff',
  46. "darkturquoise", '00ced1ff',
  47. "darkviolet", '9400d3ff',
  48. "deeppink", 'ff1493ff',
  49. "deepskyblue", '00bfffff',
  50. "dimgray", '696969ff',
  51. "dimgrey", '696969ff',
  52. "dodgerblue", '1e90ffff',
  53. "firebrick", 'b22222ff',
  54. "floralwhite", 'fffaf0ff',
  55. "forestgreen", '228b22ff',
  56. "fuchsia", 'ff00ffff',
  57. "gainsboro", 'dcdcdcff',
  58. "ghostwhite", 'f8f8ffff',
  59. "gold", 'ffd700ff',
  60. "goldenrod", 'daa520ff',
  61. "gray", '808080ff',
  62. "green", '008000ff',
  63. "greenyellow", 'adff2fff',
  64. "grey", '808080ff',
  65. "honeydew", 'f0fff0ff',
  66. "hotpink", 'ff69b4ff',
  67. "indianred", 'cd5c5cff',
  68. "indigo", '4b0082ff',
  69. "ivory", 'fffff0ff',
  70. "khaki", 'f0e68cff',
  71. "lavender", 'e6e6faff',
  72. "lavenderblush", 'fff0f5ff',
  73. "lawngreen", '7cfc00ff',
  74. "lemonchiffon", 'fffacdff',
  75. "lightblue", 'add8e6ff',
  76. "lightcoral", 'f08080ff',
  77. "lightcyan", 'e0ffffff',
  78. "lightgoldenrodyellow", 'fafad2ff',
  79. "lightgray", 'd3d3d3ff',
  80. "lightgreen", '90ee90ff',
  81. "lightgrey", 'd3d3d3ff',
  82. "lightpink", 'ffb6c1ff',
  83. "lightsalmon", 'ffa07aff',
  84. "lightseagreen", '20b2aaff',
  85. "lightskyblue", '87cefaff',
  86. "lightslategray", '778899ff',
  87. "lightslategrey", '778899ff',
  88. "lightsteelblue", 'b0c4deff',
  89. "lightyellow", 'ffffe0ff',
  90. "lime", '00ff00ff',
  91. "limegreen", '32cd32ff',
  92. "linen", 'faf0e6ff',
  93. "magenta", 'ff00ffff',
  94. "maroon", '800000ff',
  95. "mediumaquamarine", '66cdaaff',
  96. "mediumblue", '0000cdff',
  97. "mediumorchid", 'ba55d3ff',
  98. "mediumpurple", '9370dbff',
  99. "mediumseagreen", '3cb371ff',
  100. "mediumslateblue", '7b68eeff',
  101. "mediumspringgreen", '00fa9aff',
  102. "mediumturquoise", '48d1ccff',
  103. "mediumvioletred", 'c71585ff',
  104. "midnightblue", '191970ff',
  105. "mintcream", 'f5fffaff',
  106. "mistyrose", 'ffe4e1ff',
  107. "moccasin", 'ffe4b5ff',
  108. "navajowhite", 'ffdeadff',
  109. "navy", '000080ff',
  110. "oldlace", 'fdf5e6ff',
  111. "olive", '808000ff',
  112. "olivedrab", '6b8e23ff',
  113. "orange", 'ffa500ff',
  114. "orangered", 'ff4500ff',
  115. "orchid", 'da70d6ff',
  116. "palegoldenrod", 'eee8aaff',
  117. "palegreen", '98fb98ff',
  118. "paleturquoise", 'afeeeeff',
  119. "palevioletred", 'db7093ff',
  120. "papayawhip", 'ffefd5ff',
  121. "peachpuff", 'ffdab9ff',
  122. "peru", 'cd853fff',
  123. "pink", 'ffc0cbff',
  124. "plum", 'dda0ddff',
  125. "powderblue", 'b0e0e6ff',
  126. "purple", '800080ff',
  127. "red", 'ff0000ff',
  128. "rosybrown", 'bc8f8fff',
  129. "royalblue", '4169e1ff',
  130. "saddlebrown", '8b4513ff',
  131. "salmon", 'fa8072ff',
  132. "sandybrown", 'f4a460ff',
  133. "seagreen", '2e8b57ff',
  134. "seashell", 'fff5eeff',
  135. "sienna", 'a0522dff',
  136. "silver", 'c0c0c0ff',
  137. "skyblue", '87ceebff',
  138. "slateblue", '6a5acdff',
  139. "slategray", '708090ff',
  140. "slategrey", '708090ff',
  141. "snow", 'fffafaff',
  142. "springgreen", '00ff7fff',
  143. "steelblue", '4682b4ff',
  144. "tan", 'd2b48cff',
  145. "teal", '008080ff',
  146. "thistle", 'd8bfd8ff',
  147. "tomato", 'ff6347ff',
  148. "turquoise", '40e0d0ff',
  149. "violet", 'ee82eeff',
  150. "wheat", 'f5deb3ff',
  151. "white", 'ffffffff',
  152. "whitesmoke", 'f5f5f5ff',
  153. "yellow", 'ffff00ff',
  154. "yellowgreen", '9acd32ff'
  155. ];
  156. function parseHex(s) {
  157. var h = parseInt(s, 16);
  158. if (isNaN(h) || h < 0 || h > 255) {
  159. throw 'Invalid hex digits';
  160. }
  161. return h;
  162. }
  163. function parseDec(s) {
  164. var d = parseInt(s, 10);
  165. if (isNaN(d) || d < 0 || d > 255) {
  166. throw 'Invalid decimal digits';
  167. }
  168. return d;
  169. }
  170. (function() {
  171. var clen = namedColors.length;
  172. for (var i=1; i<clen; i+=2) {
  173. var c = namedColors[i];
  174. namedColors[i] = {
  175. r: parseHex(c.substr(0,2)),
  176. g: parseHex(c.substr(2,2)),
  177. b: parseHex(c.substr(4,2)),
  178. a: parseHex(c.substr(6,2))
  179. }
  180. }
  181. }());
  182. function parseColorHex(s) {
  183. if (s[0] !== '#') {
  184. return false;
  185. }
  186. try {
  187. switch (s.length) {
  188. case 4: // #RGB
  189. return {
  190. r: parseHex(s.substr(1,1)),
  191. g: parseHex(s.substr(2,1)),
  192. b: parseHex(s.substr(3,1)),
  193. a: 255
  194. };
  195. case 7: // #RRGGBB
  196. return {
  197. r: parseHex(s.substr(1,2)),
  198. g: parseHex(s.substr(3,2)),
  199. b: parseHex(s.substr(5,2)),
  200. a: 255
  201. };
  202. default:
  203. return false;
  204. }
  205. }
  206. catch (e) {
  207. return false;
  208. }
  209. }
  210. function parseColorRgb(s) {
  211. if (s.substr(0, 4) !== 'rgb(') {
  212. return false;
  213. }
  214. var colors = s.substr(4).replace(')', '').split(/\s*,\s*/);
  215. try {
  216. return {
  217. r: parseDec(colors[0]),
  218. g: parseDec(colors[1]),
  219. b: parseDec(colors[2]),
  220. a: 255
  221. };
  222. }
  223. catch (e) {
  224. return false;
  225. }
  226. }
  227. function parseColorRgba(s) {
  228. if (s.substr(0, 5) !== 'rgba(') {
  229. return false;
  230. }
  231. var colors = s.substr(5).replace(')', '').split(/\s*,\s*/);
  232. try {
  233. return {
  234. r: parseDec(colors[0]),
  235. g: parseDec(colors[1]),
  236. b: parseDec(colors[2]),
  237. a: parseInt(parseFloat(colors[3])*255, 10)
  238. };
  239. }
  240. catch (e) {
  241. return false;
  242. }
  243. }
  244. function parseColorName(s) {
  245. var ndx = namedColors.indexOf(s);
  246. if (ndx == -1) {
  247. return false;
  248. }
  249. return namedColors[ndx+1];
  250. }
  251. // parse color from string that looks like:
  252. // #RGB
  253. // #RRGGBB
  254. // rgb(r,g,b)
  255. // rgba(r,g,b,a)
  256. // named color
  257. function parseColor(s) {
  258. return parseColorHex(s) || parseColorRgb(s) || parseColorRgba(s) || parseColorName(s) || { r: 0, g: 0, b: 0, a: 255 };
  259. }
  260. function CanvasGradient(context, pattern) {
  261. this._context = context;
  262. this._pattern = pattern;
  263. }
  264. CanvasGradient.proto = {}.extend({
  265. addColorStop: function(offset, color) {
  266. var oColor = parseColor(color);
  267. cairo.pattern_add_color_stop_rgba(this._pattern, offset, oColor.r/255, oColor.g/255, oColor.b/255, oColor.a/255);
  268. },
  269. destroy: function() {
  270. cairo.pattern_destroy(this._pattern);
  271. }
  272. });
  273. CanvasGradient.prototype.extend(CanvasGradient.proto);
  274. exports.extend({
  275. CanvasGradient: CanvasGradient,
  276. parseColor: parseColor
  277. });