@meonode/canvas 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/cjs/canvas/canvas.helper.js +0 -230
  2. package/dist/cjs/canvas/canvas.helper.js.map +1 -1
  3. package/dist/cjs/canvas/chart.canvas.js +70 -144
  4. package/dist/cjs/canvas/chart.canvas.js.map +1 -1
  5. package/dist/cjs/canvas/image.canvas.js +2 -2
  6. package/dist/cjs/canvas/image.canvas.js.map +1 -1
  7. package/dist/cjs/canvas/layout.canvas.js +6 -6
  8. package/dist/cjs/canvas/layout.canvas.js.map +1 -1
  9. package/dist/cjs/canvas/root.canvas.js +23 -117
  10. package/dist/cjs/canvas/root.canvas.js.map +1 -1
  11. package/dist/cjs/canvas/text.canvas.js +2 -2
  12. package/dist/cjs/canvas/text.canvas.js.map +1 -1
  13. package/dist/cjs/src/canvas/canvas.helper.d.ts +1 -20
  14. package/dist/cjs/src/canvas/canvas.helper.d.ts.map +1 -1
  15. package/dist/cjs/src/canvas/canvas.type.d.ts +1 -12
  16. package/dist/cjs/src/canvas/canvas.type.d.ts.map +1 -1
  17. package/dist/cjs/src/canvas/chart.canvas.d.ts +1 -1
  18. package/dist/cjs/src/canvas/chart.canvas.d.ts.map +1 -1
  19. package/dist/cjs/src/canvas/image.canvas.d.ts +1 -1
  20. package/dist/cjs/src/canvas/image.canvas.d.ts.map +1 -1
  21. package/dist/cjs/src/canvas/layout.canvas.d.ts +2 -2
  22. package/dist/cjs/src/canvas/layout.canvas.d.ts.map +1 -1
  23. package/dist/cjs/src/canvas/root.canvas.d.ts +3 -2
  24. package/dist/cjs/src/canvas/root.canvas.d.ts.map +1 -1
  25. package/dist/cjs/src/canvas/text.canvas.d.ts +1 -1
  26. package/dist/cjs/src/canvas/text.canvas.d.ts.map +1 -1
  27. package/dist/cjs/src/worker/comlink.pool.d.ts +30 -0
  28. package/dist/cjs/src/worker/comlink.pool.d.ts.map +1 -0
  29. package/dist/cjs/src/worker/comlink.setup.d.ts +4 -0
  30. package/dist/cjs/src/worker/comlink.setup.d.ts.map +1 -0
  31. package/dist/cjs/src/worker/worker.types.d.ts +5 -68
  32. package/dist/cjs/src/worker/worker.types.d.ts.map +1 -1
  33. package/dist/cjs/worker/comlink.pool.js +164 -0
  34. package/dist/cjs/worker/comlink.pool.js.map +1 -0
  35. package/dist/cjs/worker/comlink.setup.js +53 -0
  36. package/dist/cjs/worker/comlink.setup.js.map +1 -0
  37. package/dist/cjs/worker/render.worker.js +58 -61
  38. package/dist/cjs/worker/render.worker.js.map +1 -1
  39. package/dist/esm/canvas/canvas.helper.js +1 -230
  40. package/dist/esm/canvas/chart.canvas.js +71 -145
  41. package/dist/esm/canvas/image.canvas.js +2 -2
  42. package/dist/esm/canvas/layout.canvas.js +6 -6
  43. package/dist/esm/canvas/root.canvas.js +23 -116
  44. package/dist/esm/canvas/text.canvas.js +2 -2
  45. package/dist/esm/src/canvas/canvas.helper.d.ts +1 -20
  46. package/dist/esm/src/canvas/canvas.helper.d.ts.map +1 -1
  47. package/dist/esm/src/canvas/canvas.type.d.ts +1 -12
  48. package/dist/esm/src/canvas/canvas.type.d.ts.map +1 -1
  49. package/dist/esm/src/canvas/chart.canvas.d.ts +1 -1
  50. package/dist/esm/src/canvas/chart.canvas.d.ts.map +1 -1
  51. package/dist/esm/src/canvas/image.canvas.d.ts +1 -1
  52. package/dist/esm/src/canvas/image.canvas.d.ts.map +1 -1
  53. package/dist/esm/src/canvas/layout.canvas.d.ts +2 -2
  54. package/dist/esm/src/canvas/layout.canvas.d.ts.map +1 -1
  55. package/dist/esm/src/canvas/root.canvas.d.ts +3 -2
  56. package/dist/esm/src/canvas/root.canvas.d.ts.map +1 -1
  57. package/dist/esm/src/canvas/text.canvas.d.ts +1 -1
  58. package/dist/esm/src/canvas/text.canvas.d.ts.map +1 -1
  59. package/dist/esm/src/worker/comlink.pool.d.ts +30 -0
  60. package/dist/esm/src/worker/comlink.pool.d.ts.map +1 -0
  61. package/dist/esm/src/worker/comlink.setup.d.ts +4 -0
  62. package/dist/esm/src/worker/comlink.setup.d.ts.map +1 -0
  63. package/dist/esm/src/worker/worker.types.d.ts +5 -68
  64. package/dist/esm/src/worker/worker.types.d.ts.map +1 -1
  65. package/dist/esm/worker/comlink.pool.js +139 -0
  66. package/dist/esm/worker/comlink.setup.js +30 -0
  67. package/dist/esm/worker/render.worker.js +38 -60
  68. package/package.json +2 -1
@@ -230,237 +230,7 @@ function parsePercentage(value, base) {
230
230
  }
231
231
  return 0;
232
232
  }
233
- /**
234
- * Pre-processes a RootProps descriptor tree on the main thread before postMessage.
235
- * Executes function props against available data, stores results as serializable fields,
236
- * then strips remaining functions as a safety net.
237
- */
238
- class WorkerPreProcessor {
239
- static CHART_COLORS = ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40', '#C9CBCF'];
240
- static process(props) {
241
- const cloned = { ...props };
242
- if (cloned.children) {
243
- const childArray = Array.isArray(cloned.children) ? cloned.children : [cloned.children];
244
- cloned.children = childArray.map(child => {
245
- if (child && typeof child === 'object' && '__type' in child) {
246
- return this.processDescriptor(child);
247
- }
248
- return child;
249
- });
250
- }
251
- return this.stripNonSerializable(cloned);
252
- }
253
- static processDescriptor(desc) {
254
- if (desc.__type === 'Chart') {
255
- return this.processChartDescriptor(desc);
256
- }
257
- if ('children' in desc && desc.children) {
258
- return { ...desc, children: desc.children.map(c => this.processDescriptor(c)) };
259
- }
260
- return desc;
261
- }
262
- static processChartDescriptor(desc) {
263
- const props = { ...desc.props };
264
- const options = { ...(props.options || {}) };
265
- const chartType = props.type;
266
- const data = props.data;
267
- // xAxisLabelFormatter
268
- if (typeof options.xAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {
269
- const cartData = data;
270
- if (cartData.labels) {
271
- options._preComputedXAxisLabels = cartData.labels.map((label, index) => {
272
- try {
273
- return options.xAxisLabelFormatter(label, index);
274
- }
275
- catch (err) {
276
- console.warn(`[WorkerPreProcessor] xAxisLabelFormatter threw for label "${label}" at index ${index}:`, err);
277
- return label;
278
- }
279
- });
280
- }
281
- delete options.xAxisLabelFormatter;
282
- }
283
- // yAxisLabelFormatter
284
- if (typeof options.yAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {
285
- const cartData = data;
286
- const maxValue = Math.max(...cartData.datasets.flatMap((d) => d.data));
287
- const labels = [];
288
- for (let i = 0; i <= 5; i++) {
289
- const value = maxValue - (maxValue / 5) * i;
290
- try {
291
- labels.push(options.yAxisLabelFormatter(value));
292
- }
293
- catch (err) {
294
- console.warn(`[WorkerPreProcessor] yAxisLabelFormatter threw for value ${value}:`, err);
295
- labels.push(String(value));
296
- }
297
- }
298
- options._preComputedYAxisLabels = labels;
299
- delete options.yAxisLabelFormatter;
300
- }
301
- // renderLegendItem
302
- if (typeof options.renderLegendItem === 'function') {
303
- if (chartType === 'bar' || chartType === 'line') {
304
- const cartData = data;
305
- options._preComputedLegendItems = cartData.datasets.map((item, index) => {
306
- const color = item.color || this.generateColor(index);
307
- try {
308
- const result = options.renderLegendItem({ item, index, color });
309
- return this.nodeToDescriptor(result);
310
- }
311
- catch (err) {
312
- console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err);
313
- return null;
314
- }
315
- });
316
- }
317
- else {
318
- const pieData = data;
319
- options._preComputedLegendItems = pieData.map((item, index) => {
320
- const color = item.color || this.generateColor(index);
321
- try {
322
- const result = options.renderLegendItem({ item, index, color });
323
- return this.nodeToDescriptor(result);
324
- }
325
- catch (err) {
326
- console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err);
327
- return null;
328
- }
329
- });
330
- }
331
- delete options.renderLegendItem;
332
- }
333
- // renderLabelItem
334
- if (typeof options.renderLabelItem === 'function') {
335
- if (chartType === 'bar' || chartType === 'line') {
336
- const cartData = data;
337
- options._preComputedLabelItems = cartData.labels.map((label, index) => {
338
- try {
339
- const result = options.renderLabelItem({ item: label, index });
340
- return this.nodeToDescriptor(result);
341
- }
342
- catch (err) {
343
- console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err);
344
- return null;
345
- }
346
- });
347
- }
348
- else {
349
- const pieData = data;
350
- options._preComputedLabelItems = pieData.map((item, index) => {
351
- try {
352
- const result = options.renderLabelItem({ item, index });
353
- return this.nodeToDescriptor(result);
354
- }
355
- catch (err) {
356
- console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err);
357
- return null;
358
- }
359
- });
360
- }
361
- delete options.renderLabelItem;
362
- }
363
- // renderValueItem
364
- if (typeof options.renderValueItem === 'function' && (chartType === 'bar' || chartType === 'line')) {
365
- const cartData = data;
366
- options._preComputedValueItems = cartData.datasets.map((dataset, datasetIndex) => dataset.data.map((value, index) => {
367
- try {
368
- const result = options.renderValueItem({ item: value, index, datasetIndex });
369
- return this.nodeToDescriptor(result);
370
- }
371
- catch (err) {
372
- console.warn(`[WorkerPreProcessor] renderValueItem threw at dataset ${datasetIndex}, index ${index}:`, err);
373
- return null;
374
- }
375
- }));
376
- delete options.renderValueItem;
377
- }
378
- props.options = options;
379
- return { ...desc, props };
380
- }
381
- /**
382
- * Converts a BoxNode instance or CanvasElement to a CanvasElement.
383
- * Public API functions (Box(), Text(), etc.) already return CanvasElements,
384
- * but if someone returns an actual class instance, we convert it via initialProps.
385
- */
386
- static nodeToDescriptor(node) {
387
- if (!node)
388
- return node;
389
- // Already a CanvasElement (has __type)
390
- if (typeof node === 'object' && '__type' in node)
391
- return node;
392
- // Class instance (e.g. BoxNode, TextNode, ImageNode) — convert via duck-typing
393
- if (typeof node === 'object' && node.constructor !== Object) {
394
- if ('initialProps' in node && 'name' in node) {
395
- const { children, ...rest } = node.initialProps || {};
396
- const childArray = Array.isArray(children) ? children : children ? [children] : [];
397
- const convertedChildren = childArray
398
- .filter((c) => c)
399
- .map((c) => this.nodeToDescriptor(c))
400
- .filter((c) => !!c);
401
- const name = node.name;
402
- const type = name === 'TextNode'
403
- ? 'Text'
404
- : name === 'Row'
405
- ? 'Row'
406
- : name === 'Image'
407
- ? 'Image'
408
- : rest.flexDirection === common_const.Style.FlexDirection.Column
409
- ? 'Column'
410
- : 'Box';
411
- if (type === 'Text') {
412
- // TextNode stores original text in segments — fall back to joined segment text
413
- const text = node.segments?.map((s) => s.text).join('') ?? '';
414
- return { __type: 'Text', text, props: rest };
415
- }
416
- if (type === 'Image') {
417
- return { __type: 'Image', props: rest };
418
- }
419
- return {
420
- __type: type,
421
- props: rest,
422
- ...(convertedChildren.length > 0 ? { children: convertedChildren } : {}),
423
- };
424
- }
425
- console.warn('[WorkerPreProcessor] Render function returned an unrecognized class instance. Use descriptor functions (Box(), Text(), etc.) instead.');
426
- return null;
427
- }
428
- return node;
429
- }
430
- static generateColor(index) {
431
- return this.CHART_COLORS[index % this.CHART_COLORS.length];
432
- }
433
- static stripNonSerializable(obj) {
434
- if (obj === null || obj === undefined)
435
- return obj;
436
- if (typeof obj === 'function')
437
- return undefined;
438
- if (typeof obj === 'symbol')
439
- return undefined;
440
- if (typeof obj !== 'object')
441
- return obj;
442
- // Preserve binary data types
443
- if (Buffer.isBuffer(obj))
444
- return obj;
445
- if (obj instanceof ArrayBuffer)
446
- return obj;
447
- if (ArrayBuffer.isView(obj))
448
- return obj;
449
- if (Array.isArray(obj)) {
450
- return obj.map(item => this.stripNonSerializable(item));
451
- }
452
- const result = {};
453
- for (const key of Object.keys(obj)) {
454
- const value = obj[key];
455
- if (typeof value === 'function' || typeof value === 'symbol')
456
- continue;
457
- result[key] = this.stripNonSerializable(value);
458
- }
459
- return result;
460
- }
461
- }
462
233
 
463
- exports.WorkerPreProcessor = WorkerPreProcessor;
464
234
  exports.drawBorders = drawBorders;
465
235
  exports.drawRoundedRectPath = drawRoundedRectPath;
466
236
  exports.parseBorderRadius = parseBorderRadius;
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.helper.js","sources":["../../../../../src/canvas/canvas.helper.ts"],"sourcesContent":["import type { CanvasRenderingContext2D } from 'skia-canvas'\nimport * as YogaTypes from 'yoga-layout'\nimport { Style } from '@/constant/common.const.js'\nimport type { BoxProps, RootProps, CanvasElement, CartesianChartData, PieChartDataPoint, ChartType, ChartDataset } from '@/canvas/canvas.type.js'\n\nexport const drawBorders = ({\n ctx,\n node,\n x,\n y,\n width,\n height,\n radii,\n borderColor,\n borderStyle,\n}: {\n ctx: CanvasRenderingContext2D\n node: YogaTypes.Node\n x: number\n y: number\n width: number\n height: number\n radii: {\n TopLeft: number\n TopRight: number\n BottomLeft: number\n BottomRight: number\n }\n borderColor: BoxProps['borderColor']\n borderStyle: BoxProps['borderStyle']\n}) => {\n const borderAll = node.getBorder(YogaTypes.Edge.All) || 0\n const borderTop = Math.max(0, node.getBorder(YogaTypes.Edge.Top) || borderAll)\n const borderRight = Math.max(0, node.getBorder(YogaTypes.Edge.Right) || borderAll)\n const borderBottom = Math.max(0, node.getBorder(YogaTypes.Edge.Bottom) || borderAll)\n const borderLeft = Math.max(0, node.getBorder(YogaTypes.Edge.Left) || borderAll)\n\n const hasBorder = borderTop > 0 || borderRight > 0 || borderBottom > 0 || borderLeft > 0\n const boxSizing = node.getBoxSizing()\n\n if (hasBorder && borderColor) {\n ctx.strokeStyle = borderColor\n ctx.lineCap = 'butt'\n ctx.lineJoin = 'miter' // Use miter for sharp corners unless rounded\n\n const setDash = (width: number) => {\n if (borderStyle === Style.Border.Dotted && width > 0) {\n // Dotted: tight spacing with round caps for circular dots\n ctx.lineCap = 'round'\n ctx.setLineDash([0, width * 2]) // 0-length dash with spacing creates dots with round caps\n } else if (borderStyle === Style.Border.Dashed && width > 0) {\n ctx.lineCap = 'butt'\n const dashLength = Math.max(2, width * 1.5)\n const gapLength = Math.max(1, width)\n ctx.setLineDash([dashLength, gapLength])\n } else {\n ctx.lineCap = 'butt'\n ctx.setLineDash([]) // Solid line\n }\n }\n\n /**\n * Draws a rounded corner arc for the border.\n * @param cx The x-coordinate of the visual center of the corner curve.\n * @param cy The y-coordinate of the visual center of the corner curve.\n * @param radius The visual radius of the corner curve.\n * @param startAngle The starting angle of the arc in radians.\n * @param endAngle The ending angle of the arc in radians.\n * @param border1 The border width leading into the corner.\n * @param border2 The border width leading out of the corner.\n */\n const drawCornerArc = (cx: number, cy: number, radius: number, startAngle: number, endAngle: number, border1: number, border2: number) => {\n if (radius <= 0) return\n\n const cornerWidth = Math.max(border1, border2)\n if (cornerWidth <= 0) return\n\n let centerlineArcRadius: number\n\n if (boxSizing === Style.BoxSizing.ContentBox) {\n // For content-box, the border is outside the box, so the centerline radius is the visual radius plus half the border width.\n centerlineArcRadius = radius + cornerWidth / 2\n } else {\n // For border-box, the border is inside the box, so the centerline radius is the visual radius minus half the border width.\n // Ensure the centerline radius is not negative.\n centerlineArcRadius = Math.max(0, radius - cornerWidth / 2)\n\n if (centerlineArcRadius <= 0 && radius > 0) {\n // Draw cap for border-box when border is thicker than radius allows for centerline arc\n ctx.fillStyle = borderColor! // Use border color for fill\n ctx.beginPath()\n // Cap is centered on the visual corner center with the visual radius\n ctx.arc(cx, cy, radius, 0, 2 * Math.PI)\n ctx.fill()\n return // Cap drawn, skip arc stroke\n }\n }\n // Draw the normal arc stroke using the calculated centerline radius\n ctx.beginPath()\n ctx.lineWidth = cornerWidth\n setDash(cornerWidth)\n ctx.arc(cx, cy, centerlineArcRadius, startAngle, endAngle)\n ctx.stroke()\n }\n\n /**\n * Draws a straight line segment for the border.\n * @param x1 The x-coordinate of the starting point.\n * @param y1 The y-coordinate of the starting point.\n * @param x2 The x-coordinate of the ending point.\n * @param y2 The y-coordinate of the ending point.\n * @param borderWidth The width of the border.\n */\n const drawLine = (x1: number, y1: number, x2: number, y2: number, borderWidth: number) => {\n if (borderWidth <= 0) return\n ctx.beginPath()\n ctx.lineWidth = borderWidth\n setDash(borderWidth)\n ctx.moveTo(x1, y1)\n ctx.lineTo(x2, y2)\n ctx.stroke()\n }\n\n // Calculate half-border widths\n const halfBt = borderTop / 2\n const halfBr = borderRight / 2\n const halfBb = borderBottom / 2\n const halfBl = borderLeft / 2\n\n // Calculate effective visual radii, clamped to half dimensions of the *layout box*\n const maxRadiusX = width / 2 // This matches CSS behavior where radius is relative to the box it's applied to.\n const maxRadiusY = height / 2\n const rTL = Math.max(0, Math.min(radii.TopLeft, maxRadiusX, maxRadiusY))\n const rTR = Math.max(0, Math.min(radii.TopRight, maxRadiusX, maxRadiusY))\n const rBR = Math.max(0, Math.min(radii.BottomRight, maxRadiusX, maxRadiusY))\n const rBL = Math.max(0, Math.min(radii.BottomLeft, maxRadiusX, maxRadiusY))\n\n // --- Draw border segments based on boxSizing ---\n // For content-box, coordinates are offset *outwards* from x, y, width, height\n if (boxSizing === Style.BoxSizing.ContentBox) {\n // Top line segment\n void drawLine(x + rTL, y - halfBt, x + width - rTR, y - halfBt, borderTop)\n // Right line segment\n void drawLine(x + width + halfBr, y + rTR, x + width + halfBr, y + height - rBR, borderRight)\n // Bottom line segment\n void drawLine(x + width - rBR, y + height + halfBb, x + rBL, y + height + halfBb, borderBottom)\n // Left line segment\n void drawLine(x - halfBl, y + height - rBL, x - halfBl, y + rTL, borderLeft)\n\n void drawCornerArc(x + rTL, y + rTL, rTL, Math.PI, 1.5 * Math.PI, borderLeft, borderTop)\n void drawCornerArc(x + width - rTR, y + rTR, rTR, 1.5 * Math.PI, 2 * Math.PI, borderTop, borderRight)\n void drawCornerArc(x + width - rBR, y + height - rBR, rBR, 0, 0.5 * Math.PI, borderRight, borderBottom)\n void drawCornerArc(x + rBL, y + height - rBL, rBL, 0.5 * Math.PI, Math.PI, borderBottom, borderLeft)\n } else {\n // For border-box, coordinates are offset *inwards* from x, y, width, height\n // Top line segment\n void drawLine(x + rTL, y + halfBt, x + width - rTR, y + halfBt, borderTop)\n // Right line segment\n void drawLine(x + width - halfBr, y + rTR, x + width - halfBr, y + height - rBR, borderRight)\n // Bottom line segment\n void drawLine(x + width - rBR, y + height - halfBb, x + rBL, y + height - halfBb, borderBottom)\n // Left line segment\n void drawLine(x + halfBl, y + height - rBL, x + halfBl, y + rTL, borderLeft)\n\n // Draw corner arcs (centers relative to layout box corners, adjusted for inward border)\n // Pass visual radius (rTL, rTR etc.) to drawCornerArc\n void drawCornerArc(x + rTL, y + rTL, rTL, Math.PI, 1.5 * Math.PI, borderLeft, borderTop) // Top-Left\n void drawCornerArc(x + width - rTR, y + rTR, rTR, 1.5 * Math.PI, 2 * Math.PI, borderTop, borderRight) // Top-Right\n void drawCornerArc(x + width - rBR, y + height - rBR, rBR, 0, 0.5 * Math.PI, borderRight, borderBottom) // Bottom-Right\n void drawCornerArc(x + rBL, y + height - rBL, rBL, 0.5 * Math.PI, Math.PI, borderBottom, borderLeft) // Bottom-Left\n }\n }\n}\n\n/**\n * Draws an optimized rounded rectangle path on the canvas context.\n * Automatically clamps radius values to prevent visual artifacts based on box dimensions.\n * Uses arc-based rendering for crisp corners and consistent border appearance.\n * @param ctx The canvas 2D rendering context to draw on\n * @param x Left position of the rectangle\n * @param y Top position of the rectangle\n * @param width Width of the rectangle\n * @param height Height of the rectangle\n * @param radii Corner radius values for each corner. Values are clamped to box constraints.\n */\nexport const drawRoundedRectPath = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radii: { TopLeft: number; TopRight: number; BottomRight: number; BottomLeft: number },\n) => {\n if (width <= 0 || height <= 0) {\n ctx.beginPath()\n ctx.rect(x, y, width, height)\n return\n }\n\n ctx.beginPath()\n\n // Clamp radius values to prevent visual artifacts\n const maxRadius = Math.min(width / 2, height / 2)\n const clampedTL = Math.max(0, Math.min(radii.TopLeft, maxRadius))\n const clampedTR = Math.max(0, Math.min(radii.TopRight, maxRadius))\n const clampedBR = Math.max(0, Math.min(radii.BottomRight, maxRadius))\n const clampedBL = Math.max(0, Math.min(radii.BottomLeft, maxRadius))\n\n ctx.moveTo(x + clampedTL, y)\n\n // Draw top edge and top-right corner\n ctx.lineTo(x + width - clampedTR, y)\n clampedTR > 0 ? ctx.arc(x + width - clampedTR, y + clampedTR, clampedTR, 1.5 * Math.PI, 0) : ctx.lineTo(x + width, y)\n\n // Draw right edge and bottom-right corner\n ctx.lineTo(x + width, y + height - clampedBR)\n clampedBR > 0 ? ctx.arc(x + width - clampedBR, y + height - clampedBR, clampedBR, 0, 0.5 * Math.PI) : ctx.lineTo(x + width, y + height)\n\n // Draw bottom edge and bottom-left corner\n ctx.lineTo(x + clampedBL, y + height)\n clampedBL > 0 ? ctx.arc(x + clampedBL, y + height - clampedBL, clampedBL, 0.5 * Math.PI, Math.PI) : ctx.lineTo(x, y + height)\n\n // Draw left edge and top-left corner\n ctx.lineTo(x, y + clampedTL)\n clampedTL > 0 ? ctx.arc(x + clampedTL, y + clampedTL, clampedTL, Math.PI, 1.5 * Math.PI) : ctx.lineTo(x, y)\n\n ctx.closePath()\n}\n\n/**\n * Calculates border radius values from props\n * @param radiusProp Border radius property value\n * @returns Calculated border radii for all corners\n */\nexport const parseBorderRadius = (\n radiusProp: BoxProps['borderRadius'],\n): {\n TopLeft: number\n TopRight: number\n BottomRight: number\n BottomLeft: number\n} => {\n const radii = { TopLeft: 0, TopRight: 0, BottomRight: 0, BottomLeft: 0 }\n if (typeof radiusProp === 'number') {\n radii.TopLeft = radii.TopRight = radii.BottomRight = radii.BottomLeft = Math.max(0, radiusProp)\n } else if (typeof radiusProp === 'object' && radiusProp !== null) {\n radii.TopLeft = Math.max(0, radiusProp.TopLeft ?? 0)\n radii.TopRight = Math.max(0, radiusProp.TopRight ?? 0)\n radii.BottomRight = Math.max(0, radiusProp.BottomRight ?? 0)\n radii.BottomLeft = Math.max(0, radiusProp.BottomLeft ?? 0)\n }\n return radii\n}\n\n/**\n * Parses a percentage value or a number, returning the calculated value based on the base.\n * @param value The value to parse, can be a number, a percentage string, or undefined.\n * @param base The base value to calculate the percentage from.\n * @returns The parsed number, or 0 if the value is not a number or a valid percentage.\n */\nexport function parsePercentage(value: number | string | undefined, base: number): number {\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string' && value.endsWith('%')) {\n return base !== 0 ? (parseFloat(value) / 100) * base : 0\n }\n return 0\n}\n\n/**\n * Pre-processes a RootProps descriptor tree on the main thread before postMessage.\n * Executes function props against available data, stores results as serializable fields,\n * then strips remaining functions as a safety net.\n */\nexport class WorkerPreProcessor {\n private static readonly CHART_COLORS = ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40', '#C9CBCF']\n\n static process(props: RootProps): RootProps {\n const cloned = { ...props }\n if (cloned.children) {\n const childArray = Array.isArray(cloned.children) ? cloned.children : [cloned.children]\n cloned.children = childArray.map(child => {\n if (child && typeof child === 'object' && '__type' in child) {\n return this.processDescriptor(child as CanvasElement)\n }\n return child\n }) as any\n }\n return this.stripNonSerializable(cloned)\n }\n\n private static processDescriptor(desc: CanvasElement): CanvasElement {\n if (desc.__type === 'Chart') {\n return this.processChartDescriptor(desc)\n }\n\n if ('children' in desc && desc.children) {\n return { ...desc, children: desc.children.map(c => this.processDescriptor(c)) } as CanvasElement\n }\n\n return desc\n }\n\n private static processChartDescriptor(desc: CanvasElement & { __type: 'Chart' }): CanvasElement {\n const props = { ...desc.props }\n const options = { ...(props.options || {}) } as Record<string, any>\n const chartType = props.type as ChartType\n const data = props.data as any\n\n // xAxisLabelFormatter\n if (typeof options.xAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {\n const cartData = data as CartesianChartData\n if (cartData.labels) {\n options._preComputedXAxisLabels = cartData.labels.map((label: string, index: number) => {\n try {\n return options.xAxisLabelFormatter(label, index)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] xAxisLabelFormatter threw for label \"${label}\" at index ${index}:`, err)\n return label\n }\n })\n }\n delete options.xAxisLabelFormatter\n }\n\n // yAxisLabelFormatter\n if (typeof options.yAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {\n const cartData = data as CartesianChartData\n const maxValue = Math.max(...cartData.datasets.flatMap((d: ChartDataset) => d.data))\n const labels: string[] = []\n for (let i = 0; i <= 5; i++) {\n const value = maxValue - (maxValue / 5) * i\n try {\n labels.push(options.yAxisLabelFormatter(value))\n } catch (err) {\n console.warn(`[WorkerPreProcessor] yAxisLabelFormatter threw for value ${value}:`, err)\n labels.push(String(value))\n }\n }\n options._preComputedYAxisLabels = labels\n delete options.yAxisLabelFormatter\n }\n\n // renderLegendItem\n if (typeof options.renderLegendItem === 'function') {\n if (chartType === 'bar' || chartType === 'line') {\n const cartData = data as CartesianChartData\n options._preComputedLegendItems = cartData.datasets.map((item: ChartDataset, index: number) => {\n const color = item.color || this.generateColor(index)\n try {\n const result = options.renderLegendItem({ item, index, color })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err)\n return null\n }\n })\n } else {\n const pieData = data as PieChartDataPoint[]\n options._preComputedLegendItems = pieData.map((item: PieChartDataPoint, index: number) => {\n const color = item.color || this.generateColor(index)\n try {\n const result = options.renderLegendItem({ item, index, color })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err)\n return null\n }\n })\n }\n delete options.renderLegendItem\n }\n\n // renderLabelItem\n if (typeof options.renderLabelItem === 'function') {\n if (chartType === 'bar' || chartType === 'line') {\n const cartData = data as CartesianChartData\n options._preComputedLabelItems = cartData.labels.map((label: string, index: number) => {\n try {\n const result = options.renderLabelItem({ item: label, index })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err)\n return null\n }\n })\n } else {\n const pieData = data as PieChartDataPoint[]\n options._preComputedLabelItems = pieData.map((item: PieChartDataPoint, index: number) => {\n try {\n const result = options.renderLabelItem({ item, index })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err)\n return null\n }\n })\n }\n delete options.renderLabelItem\n }\n\n // renderValueItem\n if (typeof options.renderValueItem === 'function' && (chartType === 'bar' || chartType === 'line')) {\n const cartData = data as CartesianChartData\n options._preComputedValueItems = cartData.datasets.map((dataset: ChartDataset, datasetIndex: number) =>\n dataset.data.map((value: number, index: number) => {\n try {\n const result = options.renderValueItem({ item: value, index, datasetIndex })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderValueItem threw at dataset ${datasetIndex}, index ${index}:`, err)\n return null\n }\n }),\n )\n delete options.renderValueItem\n }\n\n props.options = options\n return { ...desc, props } as CanvasElement\n }\n\n /**\n * Converts a BoxNode instance or CanvasElement to a CanvasElement.\n * Public API functions (Box(), Text(), etc.) already return CanvasElements,\n * but if someone returns an actual class instance, we convert it via initialProps.\n */\n private static nodeToDescriptor(node: any): CanvasElement | null | undefined {\n if (!node) return node\n // Already a CanvasElement (has __type)\n if (typeof node === 'object' && '__type' in node) return node as CanvasElement\n // Class instance (e.g. BoxNode, TextNode, ImageNode) — convert via duck-typing\n if (typeof node === 'object' && node.constructor !== Object) {\n if ('initialProps' in node && 'name' in node) {\n const { children, ...rest } = node.initialProps || {}\n const childArray = Array.isArray(children) ? children : children ? [children] : []\n const convertedChildren = childArray\n .filter((c: any) => c)\n .map((c: any) => this.nodeToDescriptor(c))\n .filter((c: any): c is CanvasElement => !!c)\n\n const name = node.name as string\n const type =\n name === 'TextNode'\n ? 'Text'\n : name === 'Row'\n ? 'Row'\n : name === 'Image'\n ? 'Image'\n : rest.flexDirection === Style.FlexDirection.Column\n ? 'Column'\n : 'Box'\n if (type === 'Text') {\n // TextNode stores original text in segments — fall back to joined segment text\n const text = node.segments?.map((s: any) => s.text).join('') ?? ''\n return { __type: 'Text', text, props: rest } as CanvasElement\n }\n if (type === 'Image') {\n return { __type: 'Image', props: rest } as CanvasElement\n }\n return {\n __type: type,\n props: rest,\n ...(convertedChildren.length > 0 ? { children: convertedChildren } : {}),\n } as CanvasElement\n }\n console.warn('[WorkerPreProcessor] Render function returned an unrecognized class instance. Use descriptor functions (Box(), Text(), etc.) instead.')\n return null\n }\n return node\n }\n\n private static generateColor(index: number): string {\n return this.CHART_COLORS[index % this.CHART_COLORS.length]\n }\n\n static stripNonSerializable<T>(obj: T): T {\n if (obj === null || obj === undefined) return obj\n if (typeof obj === 'function') return undefined as unknown as T\n if (typeof obj === 'symbol') return undefined as unknown as T\n if (typeof obj !== 'object') return obj\n\n // Preserve binary data types\n if (Buffer.isBuffer(obj)) return obj\n if (obj instanceof ArrayBuffer) return obj\n if (ArrayBuffer.isView(obj)) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.stripNonSerializable(item)) as unknown as T\n }\n\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n const value = (obj as Record<string, unknown>)[key]\n if (typeof value === 'function' || typeof value === 'symbol') continue\n result[key] = this.stripNonSerializable(value)\n }\n return result as T\n }\n}\n"],"names":["YogaTypes","Style"],"mappings":"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"}
1
+ {"version":3,"file":"canvas.helper.js","sources":["../../../../../src/canvas/canvas.helper.ts"],"sourcesContent":["import type { CanvasRenderingContext2D } from 'skia-canvas'\nimport * as YogaTypes from 'yoga-layout'\nimport { Style } from '@/constant/common.const.js'\nimport type { BoxProps } from '@/canvas/canvas.type.js'\n\nexport const drawBorders = ({\n ctx,\n node,\n x,\n y,\n width,\n height,\n radii,\n borderColor,\n borderStyle,\n}: {\n ctx: CanvasRenderingContext2D\n node: YogaTypes.Node\n x: number\n y: number\n width: number\n height: number\n radii: {\n TopLeft: number\n TopRight: number\n BottomLeft: number\n BottomRight: number\n }\n borderColor: BoxProps['borderColor']\n borderStyle: BoxProps['borderStyle']\n}) => {\n const borderAll = node.getBorder(YogaTypes.Edge.All) || 0\n const borderTop = Math.max(0, node.getBorder(YogaTypes.Edge.Top) || borderAll)\n const borderRight = Math.max(0, node.getBorder(YogaTypes.Edge.Right) || borderAll)\n const borderBottom = Math.max(0, node.getBorder(YogaTypes.Edge.Bottom) || borderAll)\n const borderLeft = Math.max(0, node.getBorder(YogaTypes.Edge.Left) || borderAll)\n\n const hasBorder = borderTop > 0 || borderRight > 0 || borderBottom > 0 || borderLeft > 0\n const boxSizing = node.getBoxSizing()\n\n if (hasBorder && borderColor) {\n ctx.strokeStyle = borderColor\n ctx.lineCap = 'butt'\n ctx.lineJoin = 'miter' // Use miter for sharp corners unless rounded\n\n const setDash = (width: number) => {\n if (borderStyle === Style.Border.Dotted && width > 0) {\n // Dotted: tight spacing with round caps for circular dots\n ctx.lineCap = 'round'\n ctx.setLineDash([0, width * 2]) // 0-length dash with spacing creates dots with round caps\n } else if (borderStyle === Style.Border.Dashed && width > 0) {\n ctx.lineCap = 'butt'\n const dashLength = Math.max(2, width * 1.5)\n const gapLength = Math.max(1, width)\n ctx.setLineDash([dashLength, gapLength])\n } else {\n ctx.lineCap = 'butt'\n ctx.setLineDash([]) // Solid line\n }\n }\n\n /**\n * Draws a rounded corner arc for the border.\n * @param cx The x-coordinate of the visual center of the corner curve.\n * @param cy The y-coordinate of the visual center of the corner curve.\n * @param radius The visual radius of the corner curve.\n * @param startAngle The starting angle of the arc in radians.\n * @param endAngle The ending angle of the arc in radians.\n * @param border1 The border width leading into the corner.\n * @param border2 The border width leading out of the corner.\n */\n const drawCornerArc = (cx: number, cy: number, radius: number, startAngle: number, endAngle: number, border1: number, border2: number) => {\n if (radius <= 0) return\n\n const cornerWidth = Math.max(border1, border2)\n if (cornerWidth <= 0) return\n\n let centerlineArcRadius: number\n\n if (boxSizing === Style.BoxSizing.ContentBox) {\n // For content-box, the border is outside the box, so the centerline radius is the visual radius plus half the border width.\n centerlineArcRadius = radius + cornerWidth / 2\n } else {\n // For border-box, the border is inside the box, so the centerline radius is the visual radius minus half the border width.\n // Ensure the centerline radius is not negative.\n centerlineArcRadius = Math.max(0, radius - cornerWidth / 2)\n\n if (centerlineArcRadius <= 0 && radius > 0) {\n // Draw cap for border-box when border is thicker than radius allows for centerline arc\n ctx.fillStyle = borderColor! // Use border color for fill\n ctx.beginPath()\n // Cap is centered on the visual corner center with the visual radius\n ctx.arc(cx, cy, radius, 0, 2 * Math.PI)\n ctx.fill()\n return // Cap drawn, skip arc stroke\n }\n }\n // Draw the normal arc stroke using the calculated centerline radius\n ctx.beginPath()\n ctx.lineWidth = cornerWidth\n setDash(cornerWidth)\n ctx.arc(cx, cy, centerlineArcRadius, startAngle, endAngle)\n ctx.stroke()\n }\n\n /**\n * Draws a straight line segment for the border.\n * @param x1 The x-coordinate of the starting point.\n * @param y1 The y-coordinate of the starting point.\n * @param x2 The x-coordinate of the ending point.\n * @param y2 The y-coordinate of the ending point.\n * @param borderWidth The width of the border.\n */\n const drawLine = (x1: number, y1: number, x2: number, y2: number, borderWidth: number) => {\n if (borderWidth <= 0) return\n ctx.beginPath()\n ctx.lineWidth = borderWidth\n setDash(borderWidth)\n ctx.moveTo(x1, y1)\n ctx.lineTo(x2, y2)\n ctx.stroke()\n }\n\n // Calculate half-border widths\n const halfBt = borderTop / 2\n const halfBr = borderRight / 2\n const halfBb = borderBottom / 2\n const halfBl = borderLeft / 2\n\n // Calculate effective visual radii, clamped to half dimensions of the *layout box*\n const maxRadiusX = width / 2 // This matches CSS behavior where radius is relative to the box it's applied to.\n const maxRadiusY = height / 2\n const rTL = Math.max(0, Math.min(radii.TopLeft, maxRadiusX, maxRadiusY))\n const rTR = Math.max(0, Math.min(radii.TopRight, maxRadiusX, maxRadiusY))\n const rBR = Math.max(0, Math.min(radii.BottomRight, maxRadiusX, maxRadiusY))\n const rBL = Math.max(0, Math.min(radii.BottomLeft, maxRadiusX, maxRadiusY))\n\n // --- Draw border segments based on boxSizing ---\n // For content-box, coordinates are offset *outwards* from x, y, width, height\n if (boxSizing === Style.BoxSizing.ContentBox) {\n // Top line segment\n void drawLine(x + rTL, y - halfBt, x + width - rTR, y - halfBt, borderTop)\n // Right line segment\n void drawLine(x + width + halfBr, y + rTR, x + width + halfBr, y + height - rBR, borderRight)\n // Bottom line segment\n void drawLine(x + width - rBR, y + height + halfBb, x + rBL, y + height + halfBb, borderBottom)\n // Left line segment\n void drawLine(x - halfBl, y + height - rBL, x - halfBl, y + rTL, borderLeft)\n\n void drawCornerArc(x + rTL, y + rTL, rTL, Math.PI, 1.5 * Math.PI, borderLeft, borderTop)\n void drawCornerArc(x + width - rTR, y + rTR, rTR, 1.5 * Math.PI, 2 * Math.PI, borderTop, borderRight)\n void drawCornerArc(x + width - rBR, y + height - rBR, rBR, 0, 0.5 * Math.PI, borderRight, borderBottom)\n void drawCornerArc(x + rBL, y + height - rBL, rBL, 0.5 * Math.PI, Math.PI, borderBottom, borderLeft)\n } else {\n // For border-box, coordinates are offset *inwards* from x, y, width, height\n // Top line segment\n void drawLine(x + rTL, y + halfBt, x + width - rTR, y + halfBt, borderTop)\n // Right line segment\n void drawLine(x + width - halfBr, y + rTR, x + width - halfBr, y + height - rBR, borderRight)\n // Bottom line segment\n void drawLine(x + width - rBR, y + height - halfBb, x + rBL, y + height - halfBb, borderBottom)\n // Left line segment\n void drawLine(x + halfBl, y + height - rBL, x + halfBl, y + rTL, borderLeft)\n\n // Draw corner arcs (centers relative to layout box corners, adjusted for inward border)\n // Pass visual radius (rTL, rTR etc.) to drawCornerArc\n void drawCornerArc(x + rTL, y + rTL, rTL, Math.PI, 1.5 * Math.PI, borderLeft, borderTop) // Top-Left\n void drawCornerArc(x + width - rTR, y + rTR, rTR, 1.5 * Math.PI, 2 * Math.PI, borderTop, borderRight) // Top-Right\n void drawCornerArc(x + width - rBR, y + height - rBR, rBR, 0, 0.5 * Math.PI, borderRight, borderBottom) // Bottom-Right\n void drawCornerArc(x + rBL, y + height - rBL, rBL, 0.5 * Math.PI, Math.PI, borderBottom, borderLeft) // Bottom-Left\n }\n }\n}\n\n/**\n * Draws an optimized rounded rectangle path on the canvas context.\n * Automatically clamps radius values to prevent visual artifacts based on box dimensions.\n * Uses arc-based rendering for crisp corners and consistent border appearance.\n * @param ctx The canvas 2D rendering context to draw on\n * @param x Left position of the rectangle\n * @param y Top position of the rectangle\n * @param width Width of the rectangle\n * @param height Height of the rectangle\n * @param radii Corner radius values for each corner. Values are clamped to box constraints.\n */\nexport const drawRoundedRectPath = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radii: { TopLeft: number; TopRight: number; BottomRight: number; BottomLeft: number },\n) => {\n if (width <= 0 || height <= 0) {\n ctx.beginPath()\n ctx.rect(x, y, width, height)\n return\n }\n\n ctx.beginPath()\n\n // Clamp radius values to prevent visual artifacts\n const maxRadius = Math.min(width / 2, height / 2)\n const clampedTL = Math.max(0, Math.min(radii.TopLeft, maxRadius))\n const clampedTR = Math.max(0, Math.min(radii.TopRight, maxRadius))\n const clampedBR = Math.max(0, Math.min(radii.BottomRight, maxRadius))\n const clampedBL = Math.max(0, Math.min(radii.BottomLeft, maxRadius))\n\n ctx.moveTo(x + clampedTL, y)\n\n // Draw top edge and top-right corner\n ctx.lineTo(x + width - clampedTR, y)\n clampedTR > 0 ? ctx.arc(x + width - clampedTR, y + clampedTR, clampedTR, 1.5 * Math.PI, 0) : ctx.lineTo(x + width, y)\n\n // Draw right edge and bottom-right corner\n ctx.lineTo(x + width, y + height - clampedBR)\n clampedBR > 0 ? ctx.arc(x + width - clampedBR, y + height - clampedBR, clampedBR, 0, 0.5 * Math.PI) : ctx.lineTo(x + width, y + height)\n\n // Draw bottom edge and bottom-left corner\n ctx.lineTo(x + clampedBL, y + height)\n clampedBL > 0 ? ctx.arc(x + clampedBL, y + height - clampedBL, clampedBL, 0.5 * Math.PI, Math.PI) : ctx.lineTo(x, y + height)\n\n // Draw left edge and top-left corner\n ctx.lineTo(x, y + clampedTL)\n clampedTL > 0 ? ctx.arc(x + clampedTL, y + clampedTL, clampedTL, Math.PI, 1.5 * Math.PI) : ctx.lineTo(x, y)\n\n ctx.closePath()\n}\n\n/**\n * Calculates border radius values from props\n * @param radiusProp Border radius property value\n * @returns Calculated border radii for all corners\n */\nexport const parseBorderRadius = (\n radiusProp: BoxProps['borderRadius'],\n): {\n TopLeft: number\n TopRight: number\n BottomRight: number\n BottomLeft: number\n} => {\n const radii = { TopLeft: 0, TopRight: 0, BottomRight: 0, BottomLeft: 0 }\n if (typeof radiusProp === 'number') {\n radii.TopLeft = radii.TopRight = radii.BottomRight = radii.BottomLeft = Math.max(0, radiusProp)\n } else if (typeof radiusProp === 'object' && radiusProp !== null) {\n radii.TopLeft = Math.max(0, radiusProp.TopLeft ?? 0)\n radii.TopRight = Math.max(0, radiusProp.TopRight ?? 0)\n radii.BottomRight = Math.max(0, radiusProp.BottomRight ?? 0)\n radii.BottomLeft = Math.max(0, radiusProp.BottomLeft ?? 0)\n }\n return radii\n}\n\n/**\n * Parses a percentage value or a number, returning the calculated value based on the base.\n * @param value The value to parse, can be a number, a percentage string, or undefined.\n * @param base The base value to calculate the percentage from.\n * @returns The parsed number, or 0 if the value is not a number or a valid percentage.\n */\nexport function parsePercentage(value: number | string | undefined, base: number): number {\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string' && value.endsWith('%')) {\n return base !== 0 ? (parseFloat(value) / 100) * base : 0\n }\n return 0\n}\n"],"names":["YogaTypes","Style"],"mappings":"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"}