(seriesConfig, data, xScale, yScale, baseline)
| 215 | }; |
| 216 | |
| 217 | const prepare: AreaRenderer['prepare'] = (seriesConfig, data, xScale, yScale, baseline) => { |
| 218 | assertNotDisposed(); |
| 219 | |
| 220 | const vertices = createAreaVertices(data); |
| 221 | const requiredSize = vertices.byteLength; |
| 222 | const bufferSize = Math.max(4, requiredSize); |
| 223 | |
| 224 | if (!vertexBuffer || vertexBuffer.size < bufferSize) { |
| 225 | if (vertexBuffer) { |
| 226 | try { |
| 227 | vertexBuffer.destroy(); |
| 228 | } catch { |
| 229 | // best-effort |
| 230 | } |
| 231 | } |
| 232 | vertexBuffer = device.createBuffer({ |
| 233 | label: 'areaRenderer/vertexBuffer', |
| 234 | size: bufferSize, |
| 235 | usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST, |
| 236 | }); |
| 237 | } |
| 238 | |
| 239 | if (vertices.byteLength > 0) { |
| 240 | device.queue.writeBuffer(vertexBuffer, 0, vertices.buffer, 0, vertices.byteLength); |
| 241 | } |
| 242 | vertexCount = vertices.length / 2; |
| 243 | |
| 244 | const { xMin, xMax, yMin, yMax } = computeDataBounds(data); |
| 245 | const { a: ax, b: bx } = computeClipAffineFromScale(xScale, xMin, xMax); |
| 246 | const { a: ay, b: by } = computeClipAffineFromScale(yScale, yMin, yMax); |
| 247 | |
| 248 | const baselineValue = |
| 249 | Number.isFinite(baseline ?? Number.NaN) ? (baseline as number) : Number.isFinite(yMin) ? yMin : 0; |
| 250 | |
| 251 | writeVsUniforms(ax, bx, ay, by, baselineValue); |
| 252 | |
| 253 | // Use the resolved fill color from areaStyle.color (not seriesConfig.color). |
| 254 | const [r, g, b, a] = parseSeriesColorToRgba01(seriesConfig.areaStyle.color); |
| 255 | const opacity = clamp01(seriesConfig.areaStyle.opacity); |
| 256 | fsUniformScratchF32[0] = r; |
| 257 | fsUniformScratchF32[1] = g; |
| 258 | fsUniformScratchF32[2] = b; |
| 259 | fsUniformScratchF32[3] = clamp01(a * opacity); |
| 260 | writeUniformBuffer(device, fsUniformBuffer, fsUniformScratchF32); |
| 261 | }; |
| 262 | |
| 263 | const render: AreaRenderer['render'] = (passEncoder) => { |
| 264 | assertNotDisposed(); |
nothing calls this directly
no test coverage detected