TransferHelper.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. var TransferHelper = function() {
  2. var me = this,
  3. changed = false,
  4. canvas = document.getElementById('transfer-function'),
  5. $canvas = $(canvas),
  6. context = canvas.getContext('2d'),
  7. hiddenCanvas = document.getElementById('hidden-transfer'),
  8. hiddenContext = hiddenCanvas.getContext('2d'),
  9. transferSpanHolder = $('#transfer-span-holder'),
  10. transfer = $('#transfer'),
  11. disabled = true,
  12. handles = $('span.transfer'),
  13. $standardTf = $('img#standard-tf').get(0),
  14. offsetLeft = {
  15. blue: 0,
  16. turquois: 0.25,
  17. green: 0.5,
  18. orange: 0.75,
  19. red: 1
  20. },
  21. colorCodes = {
  22. blue: '#0000FF',
  23. turquois: '#00FFFF',
  24. green: '#00FF00',
  25. orange: '#FFFF00',
  26. red: '#FF0000'
  27. },
  28. opacities = Array(255);
  29. //black values are disabled defaultly
  30. opacities[0] = 0;
  31. for(counter = 0; counter < opacities.length; counter++) {
  32. opacities[counter] = 255;
  33. if (counter <= minGray) {
  34. opacities[counter] = 0;
  35. }
  36. }
  37. $('input#toggle-transfer').on('click', function() {
  38. if(disabled) {
  39. enableTransferFunction();
  40. } else {
  41. disableTransferFunction();
  42. }
  43. });
  44. var getOffsetLeft = function() {
  45. return transfer.offset().left - transfer.parent().offset().left;
  46. }
  47. var removePxOffString = function(str) {
  48. return parseInt(str.replace('px', ''));
  49. }
  50. var updateGradient = function() {
  51. // Create gradient
  52. var grd = context.createLinearGradient(0,0,255,0);
  53. $.each(handles, function(index, value) {
  54. var $value = $(value),
  55. colorName = $value.attr('color'),
  56. colorOffsetLeft = offsetLeft[colorName],
  57. colorCode = colorCodes[colorName];
  58. grd.addColorStop(colorOffsetLeft, colorCode);
  59. });
  60. // Fill with gradient
  61. context.fillStyle = grd;
  62. context.fillRect(0,0,255, 10);
  63. applyOpacities();
  64. changed = true;
  65. };
  66. var applyOpacities = function() {
  67. var imageData = context.getImageData(0, 0, 255, 1),
  68. data = imageData.data;
  69. for(counter = 0; counter < opacities.length; counter++) {
  70. data[(counter * 4) + 3] = opacities[counter];
  71. }
  72. hiddenContext.putImageData(imageData, 0, 0, 0, 0, 255, 1);
  73. }
  74. var updateHandlePosition = function(element) {
  75. var colorLeft = removePxOffString($(element).css('left')) - getOffsetLeft(),
  76. colorOffsetLeft = colorLeft / $canvas.width(),
  77. colorName = $(element).attr('color');
  78. if(colorOffsetLeft > 1.0) {
  79. colorOffsetLeft = 1.0;
  80. }
  81. if(colorOffsetLeft < 0.0) {
  82. colorOffsetLeft = 0.0;
  83. }
  84. offsetLeft[colorName] = colorOffsetLeft;
  85. updateGradient();
  86. };
  87. var enableTransferFunction = function() {
  88. $.each(handles, function(index, value) {
  89. var $value = $(value),
  90. colorName = $value.attr('color'),
  91. colorOffsetLeft = offsetLeft[colorName],
  92. colorLeft = getOffsetLeft() + ($canvas.width() * colorOffsetLeft),
  93. colorCode = colorCodes[colorName];
  94. $value.css({left: colorLeft, 'background-color': colorCode });
  95. $(value).draggable({
  96. containment: '#transfer-span-holder',
  97. scroll: false,
  98. axis: 'x',
  99. cursor: "crosshair",
  100. stop: function() {
  101. updateHandlePosition(this);
  102. },
  103. drag: function() {
  104. updateHandlePosition(this);
  105. }
  106. });
  107. });
  108. showHandles();
  109. updateGradient();
  110. disabled = false;
  111. };
  112. var disableTransferFunction = function() {
  113. context.drawImage($standardTf, 0, 0, 255, 10);
  114. applyOpacities();
  115. hideHandles();
  116. disabled = true;
  117. changed = true;
  118. };
  119. var showHandles = function() {
  120. $.each(handles, function(index, value) {
  121. $(value).removeClass('hidden');
  122. });
  123. };
  124. var hideHandles = function() {
  125. $.each(handles, function(index, value) {
  126. $(value).addClass('hidden');
  127. });
  128. };
  129. disableTransferFunction();
  130. $(document).on('opacityChanged', function(e, params) {
  131. if(params != undefined && params.opacities != undefined) {
  132. opacities = params.opacities;
  133. applyOpacities();
  134. changed = true;
  135. }
  136. });
  137. $(document).on('opacityBordersChanged', function(e, params) {
  138. var minGray = 0,
  139. maxGray = 255;
  140. if(params != undefined && params.minGray != undefined && params.maxGray != undefined) {
  141. minGray = params.minGray;
  142. maxGray = params.maxGray;
  143. for(counter = 0; counter < 255; counter++) {
  144. var opacity = 255;
  145. if(counter < minGray || counter > maxGray) {
  146. opacity = 1;
  147. }
  148. opacities[counter] = opacity;
  149. }
  150. applyOpacities();
  151. changed = true;
  152. }
  153. });
  154. return {
  155. transferFunctionChanged : function() {
  156. return changed;
  157. },
  158. getCurrentTransferFunction : function() {
  159. changed = false;
  160. return hiddenContext.getImageData(0, 0, 255, 1);
  161. }
  162. };
  163. }