Requires

Provides

InnerShadow.js

Drops inner shadow

License:
Public domain (http://unlicense.org).
Authors:
Yaroslaff Fedin
  1. 22
LSD.Layer.InnerShadow = new Class({

Extends: LSD.Layer.Shadow,

  1. 25
  2. 26
  3. 27
  4. 28
  5. 29
  6. 30
  7. 31
  8. 32
  9. 33
  10. 34
  11. 35
  12. 36
  13. 37
  14. 38
  15. 39
  16. 40
  17. 41
  18. 42
  19. 43
  20. 44
  21. 45
  22. 46
  23. 47
  24. 48
  25. 49
  26. 50
  27. 51
  28. 52
  29. 53
  30. 54
  31. 55
  32. 56
  33. 57
  34. 58
  35. 59
  36. 60
  37. 61
  38. 62
  39. 63
  40. 64
  41. 65
  42. 66
  43. 67
  44. 68
  45. 69
  46. 70
  47. 71
  48. 72
  49. 73
  50. 74
  51. 75
  52. 76
  53. 77
  54. 78
  55. 79
  56. 80
  57. 81
  58. 82
  59. 83
  60. 84
  61. 85
  62. 86
  63. 87
  64. 88
  65. 89
  66. 90
  67. 91
  68. 92
  69. 93
  70. 94
  71. 95
  72. 96
  73. 97
  74. 98
  75. 99
  76. 100
properties: { required: ['innerShadowColor'], numerical: ['innerShadowBlur', 'innerShadowOffsetX', 'innerShadowOffsetY'] }, paint: function(color, blur, x, y) { var fill = new Color(color); fill.base = fill.alpha; var transition = function(p){ return 1 - Math.sin((1 - p) * Math.PI / 2); }; var offset = Math.max(Math.abs(x), Math.abs(y)); blur += offset; for (var i = 0; i < blur; i++) { if (blur == 0) { fill.alpha = Math.min(fill.base * 2, 1) } else { fill.alpha = fill.base * transition((blur - i) / blur) } var layer = this.layers[i]; if (!layer) layer = this.layers[i] = LSD.Layer.InnerShadow.Layer.getInstance(this); layer.layer = this; layer.base = this.base; layer.blur = blur layer.dy = y - x layer.y = Math.max(Math.min(layer.dy, 0) + i, 0); layer.dx = x - y; layer.x = Math.max(Math.min(layer.dx, 0) + i, 0); layer.produce([ Math.min(((layer.x > 0) ? ((layer.dx - i < 0) ? 1 : 0.5) * - layer.x - 0.25 : 0), 0), Math.min(((layer.y > 0) ? (layer.dy + i < 0 ? 1 : 0.5) * - layer.y - 0.25: 0), 0) ]); layer.stroke(fill, 1); } var length = this.layers.length; for (var i = blur; i < length; i++) if (this.layers[i]) LSD.Layer.InnerShadow.Layer.release(this.layers[i]); this.layers.splice(blur, length); }, translate: function(x, y) { this.parent.apply(this, arguments); for (var i = 0, j = this.layers.length; i < j; i++) { var layer = this.layers[i]; if (layer) layer.translate(x + layer.x, y + layer.y); } }, eject: function() { for (var i = 0, j = this.layers.length; i < j; i++) { var layer = this.layers[i]; if (!layer) continue; LSD.Layer.InnerShadow.Layer.release(layer) if (layer.shape.element.parentNode) layer.shape.element.parentNode.removeChild(layer.shape.element); } }, inject: function(node) { this.parent.apply(this, arguments); this.update.apply(this, arguments); }, update: function() { for (var i = 0, j = this.layers.length; i < j; i++) if (this.layers[i]) this.layers[i].inject.apply(this.layers[i], arguments); } }); LSD.Layer.InnerShadow.Layer = new Class({ Extends: LSD.Layer }); LSD.Layer.InnerShadow.Layer.stack = []; LSD.Layer.InnerShadow.Layer.getInstance = function() { return LSD.Layer.InnerShadow.Layer.stack.pop() || (new LSD.Layer.InnerShadow.Layer); } LSD.Layer.InnerShadow.Layer.release = function(layer) { layer.element.parentNode.removeChild(layer.element); LSD.Layer.InnerShadow.Layer.stack.push(layer); };