()
| 2731 | }; |
| 2732 | |
| 2733 | function sliceRenderSeriesToVisibleRange(): void { |
| 2734 | const zoomRange = zoomState?.getRange() ?? null; |
| 2735 | const baseXDomain = computeBaseXDomain(currentOptions, runtimeRawBoundsByIndex); |
| 2736 | const visibleX = computeVisibleXDomain(baseXDomain, zoomRange); |
| 2737 | |
| 2738 | // Fast path: no zoom or full span - use baseline directly |
| 2739 | const isFullSpan = |
| 2740 | zoomRange == null || |
| 2741 | (Number.isFinite(zoomRange.start) && |
| 2742 | Number.isFinite(zoomRange.end) && |
| 2743 | zoomRange.start <= 0 && |
| 2744 | zoomRange.end >= 100); |
| 2745 | |
| 2746 | if (isFullSpan) { |
| 2747 | renderSeries = runtimeBaseSeries; |
| 2748 | // Recompute visible y-bounds from the full baseline series |
| 2749 | recomputeCachedVisibleYBoundsIfNeeded(); |
| 2750 | return; |
| 2751 | } |
| 2752 | |
| 2753 | const next: ResolvedChartGPUOptions['series'][number][] = new Array(runtimeBaseSeries.length); |
| 2754 | |
| 2755 | for (let i = 0; i < runtimeBaseSeries.length; i++) { |
| 2756 | const baseline = runtimeBaseSeries[i]!; |
| 2757 | |
| 2758 | // Pie charts don't need slicing |
| 2759 | if (baseline.type === 'pie') { |
| 2760 | next[i] = baseline; |
| 2761 | continue; |
| 2762 | } |
| 2763 | |
| 2764 | const cache = lastSampledData[i]; |
| 2765 | |
| 2766 | // Strategy 1: Use cache if it covers visible range |
| 2767 | if (cache && |
| 2768 | visibleX.min >= cache.cachedRange.min && |
| 2769 | visibleX.max <= cache.cachedRange.max) { |
| 2770 | |
| 2771 | if (baseline.type === 'candlestick') { |
| 2772 | next[i] = { |
| 2773 | ...baseline, |
| 2774 | data: sliceVisibleRangeByOHLC(cache.data as unknown as ReadonlyArray<OHLCDataPoint>, visibleX.min, visibleX.max) |
| 2775 | }; |
| 2776 | } else { |
| 2777 | next[i] = { |
| 2778 | ...baseline, |
| 2779 | data: sliceVisibleRangeByX(cache.data as unknown as ReadonlyArray<DataPoint>, visibleX.min, visibleX.max) |
| 2780 | }; |
| 2781 | } |
| 2782 | continue; |
| 2783 | } |
| 2784 | |
| 2785 | // Strategy 2: Fallback to baseline sampled data |
| 2786 | if (baseline.type === 'candlestick') { |
| 2787 | next[i] = { |
| 2788 | ...baseline, |
| 2789 | data: sliceVisibleRangeByOHLC(baseline.data as ReadonlyArray<OHLCDataPoint>, visibleX.min, visibleX.max) |
| 2790 | }; |
no test coverage detected