| 4758 | } |
| 4759 | |
| 4760 | function erodeMask(mask, sw, sh) { |
| 4761 | |
| 4762 | var weights = [1, 1, 1, 1, 0, 1, 1, 1, 1]; |
| 4763 | var side = Math.round(Math.sqrt(weights.length)); |
| 4764 | var halfSide = Math.floor(side / 2); |
| 4765 | |
| 4766 | var maskResult = []; |
| 4767 | for (var y = 0; y < sh; y++) { |
| 4768 | for (var x = 0; x < sw; x++) { |
| 4769 | |
| 4770 | var so = y * sw + x; |
| 4771 | var a = 0; |
| 4772 | for (var cy = 0; cy < side; cy++) { |
| 4773 | for (var cx = 0; cx < side; cx++) { |
| 4774 | var scy = y + cy - halfSide; |
| 4775 | var scx = x + cx - halfSide; |
| 4776 | |
| 4777 | if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) { |
| 4778 | |
| 4779 | var srcOff = scy * sw + scx; |
| 4780 | var wt = weights[cy * side + cx]; |
| 4781 | |
| 4782 | a += mask[srcOff] * wt; |
| 4783 | } |
| 4784 | } |
| 4785 | } |
| 4786 | |
| 4787 | maskResult[so] = (a === 255 * 8) ? 255 : 0; |
| 4788 | } |
| 4789 | } |
| 4790 | |
| 4791 | return maskResult; |
| 4792 | } |
| 4793 | |
| 4794 | function dilateMask(mask, sw, sh) { |
| 4795 | |