test.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. 'use strict'
  2. require('enable-mobile')
  3. document.body.style.fontFamily = 'sans-serif'
  4. document.body.style.padding = '2rem'
  5. var calcSDF = require('./')
  6. var canvas = document.body.appendChild(document.createElement('canvas'))
  7. canvas.style.margin = '1rem 1rem 1rem 0'
  8. canvas.width = 165
  9. canvas.height = 150
  10. var ctx = canvas.getContext('2d')
  11. ctx.fillStyle = 'black'
  12. ctx.fillRect(0,0,canvas.width, canvas.height)
  13. ctx.fillStyle = 'white'
  14. ctx.font = 'bold 100px sans-serif'
  15. ctx.fillText('X', 50, 100)
  16. var out = document.body.appendChild(document.createElement('canvas'))
  17. out.style.margin = '1rem 1rem 1rem 0'
  18. out.width = 165
  19. out.height = 150
  20. var outCtx = out.getContext('2d')
  21. outCtx.drawImage(canvas, 0, 0);
  22. var cutoff = 0, radius = 10
  23. update()
  24. function update () {
  25. var idata = ctx.getImageData(0,0,canvas.width, canvas.height).data
  26. var data = Array(canvas.width*canvas.height)
  27. for (var i = 0; i < data.length; i++) {
  28. data[i] = idata[i*4]/255
  29. }
  30. console.time('sdf')
  31. var arr = calcSDF(data, {
  32. cutoff: cutoff,
  33. radius: radius,
  34. width: canvas.width,
  35. height: canvas.height
  36. })
  37. console.timeEnd('sdf')
  38. let imgArr
  39. if (global.Uint8ClampedArray) {
  40. imgArr = new Uint8ClampedArray(165*150*4)
  41. } else {
  42. imgArr = Array(165*150*4)
  43. }
  44. for (let i = 0; i < 165; i++) {
  45. for (let j = 0; j < 150; j++) {
  46. imgArr[j*165*4 + i*4 + 0] = arr[j*165+i]*255
  47. imgArr[j*165*4 + i*4 + 1] = arr[j*165+i]*255
  48. imgArr[j*165*4 + i*4 + 2] = arr[j*165+i]*255
  49. imgArr[j*165*4 + i*4 + 3] = 255
  50. }
  51. }
  52. // IE way
  53. var c = document.createElement('canvas');
  54. var data = c.getContext('2d').createImageData(165, 150);
  55. if (data.data.set) {
  56. data.data.set(imgArr);
  57. }
  58. else {
  59. for (var i = 0; i < imgArr.length; i++) {
  60. data.data[i] = imgArr[i]
  61. }
  62. }
  63. // var data = new ImageData(imgArr, 165, 150)
  64. outCtx.putImageData(data, 0, 0)
  65. }
  66. var cutoffTitle = document.body.appendChild(document.createElement('label'))
  67. cutoffTitle.innerHTML = 'Cutoff'
  68. cutoffTitle.style.display = 'block'
  69. var cutoffEl = document.body.appendChild(document.createElement('input'))
  70. cutoffEl.type = 'range'
  71. cutoffEl.min = 0
  72. cutoffEl.max = 1
  73. cutoffEl.step = 0.001
  74. cutoffEl.value = cutoff
  75. cutoffEl.oninput = e => {
  76. cutoff = parseFloat(cutoffEl.value)
  77. update()
  78. }
  79. var radTitle = document.body.appendChild(document.createElement('label'))
  80. radTitle.innerHTML = 'Radius'
  81. radTitle.style.display = 'block'
  82. var radEl = document.body.appendChild(document.createElement('input'))
  83. radEl.type = 'range'
  84. radEl.min = 0
  85. radEl.max = 100
  86. radEl.step = 0.2
  87. radEl.value = radius
  88. radEl.oninput = e => {
  89. radius = parseFloat(radEl.value)
  90. update()
  91. }