| 37 | } |
| 38 | |
| 39 | getUserCode(): string { |
| 40 | const userCode = ` |
| 41 | fn mapCoord(outCoord : f32, len : f32) -> f32{ |
| 42 | var inCoord = outCoord; |
| 43 | if(uniforms.fillModeId == 2) { |
| 44 | if (inCoord < 0.0) { |
| 45 | if (len <= 1.0) { |
| 46 | inCoord = 0.0; |
| 47 | } else { |
| 48 | let sz2 = 2.0 * len; |
| 49 | if (inCoord < sz2) { |
| 50 | inCoord = sz2 * f32(i32(f32(-inCoord / sz2))) + |
| 51 | inCoord; |
| 52 | } |
| 53 | if (inCoord < -len) { |
| 54 | inCoord = inCoord + sz2; |
| 55 | } else { |
| 56 | inCoord = -inCoord - 1.0; |
| 57 | } |
| 58 | } |
| 59 | } else if (inCoord > len - 1.0) { |
| 60 | if (len <= 1.0) { |
| 61 | inCoord = 0.0; |
| 62 | } else { |
| 63 | let sz2 = 2.0 * len; |
| 64 | inCoord = inCoord - sz2 * f32(i32(f32(inCoord / sz2))); |
| 65 | if (inCoord >= len) { |
| 66 | inCoord = sz2 - inCoord - 1.0; |
| 67 | } |
| 68 | } |
| 69 | } |
| 70 | return clamp(inCoord, 0.0, len - 1.0); |
| 71 | } else if (uniforms.fillModeId == 3) { |
| 72 | if (inCoord < 0.0) { |
| 73 | if (len <= 1.0) { |
| 74 | inCoord = 0.0; |
| 75 | } else { |
| 76 | let sz = len - 1.0; |
| 77 | inCoord = inCoord + len * (f32(i32(f32(-inCoord / sz))) + 1.0); |
| 78 | } |
| 79 | } else if (inCoord > len - 1.0) { |
| 80 | if (len <= 1.0) { |
| 81 | inCoord = 0.0; |
| 82 | } else { |
| 83 | let sz = len - 1.0; |
| 84 | inCoord = inCoord - len * f32(i32(f32(inCoord / sz))); |
| 85 | } |
| 86 | } |
| 87 | return clamp(inCoord, 0.0, len - 1.0); |
| 88 | } else if (uniforms.fillModeId == 4) { |
| 89 | return clamp(outCoord, 0.0, len - 1.0); |
| 90 | } |
| 91 | return outCoord; |
| 92 | } |
| 93 | fn readWithFillValue(batch : i32, coordY : i32, coordX : i32, |
| 94 | channel : i32) -> f32 { |
| 95 | var outputValue : f32; |
| 96 | if (0 <= coordY && coordY < uniforms.imageShape[1] && 0 <= coordX && coordX < uniforms.imageShape[2]) { |