()
| 647 | } |
| 648 | |
| 649 | function ensureStrideWorker(): Worker { |
| 650 | if (strideWorker) return strideWorker; |
| 651 | strideWorker = new StrideCorrectionWorker(); |
| 652 | strideWorker.onmessage = (e: MessageEvent<StrideCorrectionResponse>) => { |
| 653 | if (e.data.type !== "corrected" || !directCanvas || !directCtx) return; |
| 654 | |
| 655 | const { buffer, width, height } = e.data; |
| 656 | const renderStart = performance.now(); |
| 657 | if (directCanvas.width !== width || directCanvas.height !== height) { |
| 658 | directCanvas.width = width; |
| 659 | directCanvas.height = height; |
| 660 | } |
| 661 | |
| 662 | const frameData = new Uint8ClampedArray(buffer); |
| 663 | if ( |
| 664 | !cachedStrideImageData || |
| 665 | cachedStrideWidth !== width || |
| 666 | cachedStrideHeight !== height |
| 667 | ) { |
| 668 | cachedStrideImageData = new ImageData(width, height); |
| 669 | cachedStrideWidth = width; |
| 670 | cachedStrideHeight = height; |
| 671 | } |
| 672 | cachedStrideImageData.data.set(frameData); |
| 673 | directCtx.putImageData(cachedStrideImageData, 0, 0); |
| 674 | |
| 675 | storeRenderedFrame( |
| 676 | cachedStrideImageData.data, |
| 677 | width, |
| 678 | height, |
| 679 | width * 4, |
| 680 | false, |
| 681 | ); |
| 682 | recordRender(performance.now() - renderStart, "canvas2d"); |
| 683 | onmessage({ width, height }); |
| 684 | }; |
| 685 | return strideWorker; |
| 686 | } |
| 687 | |
| 688 | function renderRgbaFrameCanvas2D(buffer: ArrayBuffer, receivedAt: number) { |
| 689 | if (!directCanvas || !directCtx) return; |
no test coverage detected