@meonode/canvas 1.0.0-beta.4 → 1.0.0
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.
- package/dist/cjs/canvas/canvas.helper.d.ts +9 -11
- package/dist/cjs/canvas/canvas.helper.d.ts.map +1 -1
- package/dist/cjs/canvas/canvas.helper.js +39 -47
- package/dist/cjs/canvas/canvas.helper.js.map +1 -1
- package/dist/cjs/canvas/canvas.type.d.ts +1 -1
- package/dist/cjs/canvas/canvas.type.d.ts.map +1 -1
- package/dist/cjs/canvas/grid.canvas.util.d.ts +4 -4
- package/dist/cjs/canvas/grid.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/grid.canvas.util.js +21 -4
- package/dist/cjs/canvas/grid.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/image.canvas.util.d.ts +0 -1
- package/dist/cjs/canvas/image.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/image.canvas.util.js +72 -72
- package/dist/cjs/canvas/image.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/layout.canvas.util.d.ts +16 -17
- package/dist/cjs/canvas/layout.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/layout.canvas.util.js +17 -24
- package/dist/cjs/canvas/layout.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/root.canvas.util.d.ts +4 -2
- package/dist/cjs/canvas/root.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/root.canvas.util.js +7 -3
- package/dist/cjs/canvas/root.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/text.canvas.util.d.ts +20 -27
- package/dist/cjs/canvas/text.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/text.canvas.util.js +27 -45
- package/dist/cjs/canvas/text.canvas.util.js.map +1 -1
- package/dist/esm/canvas/canvas.helper.d.ts +9 -11
- package/dist/esm/canvas/canvas.helper.d.ts.map +1 -1
- package/dist/esm/canvas/canvas.helper.js +39 -47
- package/dist/esm/canvas/canvas.type.d.ts +1 -1
- package/dist/esm/canvas/canvas.type.d.ts.map +1 -1
- package/dist/esm/canvas/grid.canvas.util.d.ts +4 -4
- package/dist/esm/canvas/grid.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/grid.canvas.util.js +21 -4
- package/dist/esm/canvas/image.canvas.util.d.ts +0 -1
- package/dist/esm/canvas/image.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/image.canvas.util.js +72 -72
- package/dist/esm/canvas/layout.canvas.util.d.ts +16 -17
- package/dist/esm/canvas/layout.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/layout.canvas.util.js +17 -24
- package/dist/esm/canvas/root.canvas.util.d.ts +4 -2
- package/dist/esm/canvas/root.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/root.canvas.util.js +7 -3
- package/dist/esm/canvas/text.canvas.util.d.ts +20 -27
- package/dist/esm/canvas/text.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/text.canvas.util.js +27 -45
- package/package.json +5 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.canvas.util.js","sources":["../../../../src/canvas/layout.canvas.util.ts"],"sourcesContent":["import { Canvas, type CanvasRenderingContext2D } from 'skia-canvas'\nimport { drawBorders, drawRoundedRectPath, parseBorderRadius, parsePercentage } from '@/canvas/canvas.helper.js'\nimport type { BaseProps, BoxProps, BoxShadowProps } from '@/canvas/canvas.type.js'\nimport { omit } from 'lodash-es'\nimport tinycolor from 'tinycolor2'\nimport Yoga, { Style, Node } from '@/constant/common.const.js'\n\n/**\n * @class BoxNode\n * @classdesc Base node class for rendering rectangular boxes with layout, styling, and children.\n * It uses the Yoga layout engine for positioning and sizing.\n */\nexport class BoxNode {\n /**\n * @property {Partial<BoxProps>} initialProps - Original props passed to the constructor before any modifications.\n */\n initialProps: Partial<BoxProps>\n /**\n * @property {Node} node - The Yoga layout engine node.\n */\n node: Node\n /**\n * @property {BoxNode[]} children - Child nodes.\n */\n children: BoxNode[]\n /**\n * @property {BoxProps & BaseProps} props - Current props including defaults and inherited values.\n */\n props: BoxProps & BaseProps\n /**\n * @property {string} name - Node type name.\n */\n readonly name?: string\n /**\n * @property {string} key - Unique node identifier.\n */\n key?: string\n /**\n * Creates a new BoxNode instance\n * @param props - Initial box properties and styling\n */\n constructor(props: BoxProps & BaseProps = {}) {\n const children = (Array.isArray(props?.children) ? props.children : [props.children]).filter(child => child)\n this.initialProps = { ...props, children }\n this.node = Yoga.Node.create()\n this.children = []\n\n this.props = {\n key: this.key,\n borderColor: 'black',\n borderStyle: Style.Border.Solid,\n boxSizing: Style.BoxSizing.BorderBox,\n opacity: 1,\n flexShrink: 1,\n ...this.initialProps,\n }\n this.name = this.props.name || 'Box'\n this.key = this.props.key || `${this.name}-0`\n\n this.setLayout(this.props)\n }\n\n /**\n * Processes and appends any children passed in the initial props.\n */\n public processInitialChildren() {\n if (this.props.children) {\n const childrenToAdd = Array.isArray(this.props.children) ? this.props.children : [this.props.children]\n childrenToAdd.forEach((child, index) => {\n if (child) {\n this.appendChild(child, index)\n }\n })\n }\n }\n\n /**\n * Inherits styles from the parent node.\n * @param {BoxProps & BaseProps} parentProps - Parent node properties to inherit from.\n */\n protected resolveInheritedStyles(parentProps: BoxProps & BaseProps) {\n if (parentProps.key) {\n this.key = `${parentProps.key}-${this.key}`\n this.props.key = this.key\n }\n\n const inheritableKeys = [\n 'fontSize',\n 'fontFamily',\n 'fontWeight',\n 'fontStyle',\n 'color',\n 'textAlign',\n 'verticalAlign',\n 'lineHeight',\n 'lineGap',\n 'letterSpacing',\n 'wordSpacing',\n 'textDecoration',\n 'maxLines',\n 'fontVariant',\n ]\n\n for (const key of inheritableKeys) {\n if (this.initialProps[key] === undefined && parentProps[key] !== undefined) {\n this.props[key] = parentProps[key]\n }\n }\n\n if (!this.node.isDirty()) {\n this.node.markDirty()\n }\n }\n\n /**\n * Applies node type-specific default values after inheritance.\n */\n protected applyDefaults(): void {\n // Base implementation does nothing; subclasses can override.\n }\n\n /**\n * Appends a child node at the specified index.\n * @param {BoxNode} child - Child node to append.\n * @param index - Index to insert child at\n */\n protected appendChild(child: BoxNode, index: number) {\n if (!child || !child.node) {\n console.warn('Attempted to append an invalid child node.', child)\n return\n }\n\n child.resolveInheritedStyles(omit(this.props, 'children'))\n child.applyDefaults()\n this.children.push(child)\n this.node.insertChild(child.node, index)\n child.processInitialChildren()\n }\n\n /**\n * Performs final layout adjustments recursively after the main layout calculation.\n * @returns {boolean} Whether any node was marked as dirty during finalization.\n */\n public finalizeLayout() {\n let wasDirty = false\n this.updateLayoutBasedOnComputedSize()\n if (this.node.isDirty()) {\n wasDirty = true\n }\n\n for (const child of this.children) {\n child.finalizeLayout()\n if (child.node.isDirty()) {\n wasDirty = true\n }\n }\n\n return wasDirty\n }\n\n /**\n * Hook for subclasses to update layout based on computed size.\n */\n protected updateLayoutBasedOnComputedSize() {\n // Base implementation does nothing; subclasses can override.\n }\n\n /**\n * Applies layout properties to the Yoga node.\n * @param props - Box properties containing layout values\n */\n protected setLayout(props: BoxProps) {\n // --- Yoga layout property application ---\n // (This entire block remains unchanged as it interacts with Yoga, not the canvas library)\n const {\n width,\n height,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flexDirection,\n justifyContent,\n alignItems,\n alignSelf,\n alignContent,\n flexGrow,\n flexShrink,\n flexBasis,\n positionType,\n position,\n gap,\n margin,\n padding,\n border,\n aspectRatio,\n overflow,\n display,\n boxSizing = Style.BoxSizing.BorderBox,\n direction = Style.Direction.LTR,\n flexWrap,\n } = props\n\n if (width !== undefined) this.node.setWidth(width)\n if (height !== undefined) this.node.setHeight(height)\n if (minWidth !== undefined) this.node.setMinWidth(minWidth)\n if (minHeight !== undefined) this.node.setMinHeight(minHeight)\n if (maxWidth !== undefined) this.node.setMaxWidth(maxWidth)\n if (maxHeight !== undefined) this.node.setMaxHeight(maxHeight)\n if (flexDirection !== undefined) this.node.setFlexDirection(flexDirection)\n if (justifyContent !== undefined) this.node.setJustifyContent(justifyContent)\n if (alignItems !== undefined) this.node.setAlignItems(alignItems)\n if (alignSelf !== undefined) this.node.setAlignSelf(alignSelf)\n if (alignContent !== undefined) this.node.setAlignContent(alignContent)\n if (flexGrow !== undefined) this.node.setFlexGrow(flexGrow)\n if (flexShrink !== undefined) this.node.setFlexShrink(flexShrink)\n if (positionType !== undefined) this.node.setPositionType(positionType)\n if (flexBasis !== undefined) this.node.setFlexBasis(flexBasis)\n if (position) {\n if (typeof position === 'number') {\n this.node.setPosition(Style.Edge.All, position)\n } else if (typeof position === 'string' && position.endsWith('%')) {\n this.node.setPositionPercent(Style.Edge.All, parseFloat(position))\n } else {\n for (const [edge, value] of Object.entries(position)) {\n if (edge in Style.Edge) {\n if (typeof value === 'string' && value.endsWith('%')) {\n this.node.setPositionPercent(Style.Edge[edge], parseFloat(value))\n } else {\n this.node.setPosition(Style.Edge[edge], value as number)\n }\n }\n }\n }\n }\n if (gap) {\n if (typeof gap === 'number') {\n this.node.setGap(Style.Gutter.All, gap)\n } else if (typeof gap === 'string' && gap.endsWith('%')) {\n this.node.setGapPercent(Style.Gutter.All, parseFloat(gap))\n } else {\n for (const [gutter, value] of Object.entries(gap)) {\n if (gutter in Style.Gutter) {\n if (typeof value === 'string' && value.endsWith('%')) {\n this.node.setGapPercent(Style.Gutter[gutter], parseFloat(value))\n } else {\n this.node.setGap(Style.Gutter[gutter], value as number)\n }\n }\n }\n }\n }\n if (margin) {\n if (typeof margin === 'number' || margin === 'auto') {\n this.node.setMargin(Style.Edge.All, margin)\n } else if (typeof margin === 'string' && margin.endsWith('%')) {\n this.node.setMarginPercent(Style.Edge.All, parseFloat(margin))\n } else {\n for (const [edge, value] of Object.entries(margin)) {\n if (edge in Style.Edge) {\n if (typeof value === 'string' && value.endsWith('%')) {\n this.node.setMarginPercent(Style.Edge[edge], parseFloat(value))\n } else {\n this.node.setMargin(Style.Edge[edge], value as number)\n }\n }\n }\n }\n }\n if (padding) {\n if (typeof padding === 'number') {\n this.node.setPadding(Style.Edge.All, padding)\n } else if (typeof padding === 'string' && padding.endsWith('%')) {\n this.node.setPaddingPercent(Style.Edge.All, parseFloat(padding))\n } else {\n for (const [edge, value] of Object.entries(padding)) {\n if (edge in Style.Edge) {\n if (typeof value === 'string' && value.endsWith('%')) {\n this.node.setPaddingPercent(Style.Edge[edge], parseFloat(value))\n } else {\n this.node.setPadding(Style.Edge[edge], value as number)\n }\n }\n }\n }\n }\n if (border) {\n if (typeof border === 'number') {\n this.node.setBorder(Style.Edge.All, border)\n } else {\n for (const [edge, value] of Object.entries(border)) {\n if (edge in Style.Edge) this.node.setBorder(Style.Edge[edge], value)\n }\n }\n }\n if (aspectRatio !== undefined) this.node.setAspectRatio(aspectRatio)\n if (overflow !== undefined) this.node.setOverflow(overflow)\n if (display !== undefined) this.node.setDisplay(display)\n if (boxSizing !== undefined) this.node.setBoxSizing(boxSizing)\n if (direction !== undefined) this.node.setDirection(direction)\n if (flexWrap !== undefined) this.node.setFlexWrap(flexWrap)\n // --- End Yoga layout property application ---\n }\n\n /**\n * Renders the node and its children to the canvas.\n * @param {CanvasRenderingContext2D} ctx - Canvas rendering context (from skia-canvas).\n * @param {number} offsetX - X offset for rendering.\n * @param {number} offsetY - Y offset for rendering.\n */\n render(ctx: CanvasRenderingContext2D, offsetX = 0, offsetY = 0) {\n const layout = this.node.getComputedLayout()\n const x = layout.left + offsetX\n const y = layout.top + offsetY\n const width = layout.width\n const height = layout.height\n\n // Exit early if the node is invisible or has no dimensions.\n if (width <= 0 || height <= 0 || this.props.display === Style.Display.None) {\n return\n }\n\n // --- Opacity Setup ---\n const desiredOpacity = Math.max(0, Math.min(1, this.props.opacity ?? 1))\n let originalAlpha: number | undefined = undefined\n let appliedOpacity = false\n if (desiredOpacity < 1) {\n originalAlpha = ctx.globalAlpha\n ctx.globalAlpha = originalAlpha * desiredOpacity\n appliedOpacity = true\n }\n // --- End Opacity Setup ---\n\n try {\n // --- Transformation Setup ---\n const transform = this.props.transform\n const needsTransform =\n transform &&\n (transform.translateX ||\n transform.translateY ||\n transform.rotate ||\n transform.scale ||\n transform.scaleX ||\n transform.scaleY)\n\n let savedContextForTransform = false\n if (needsTransform) {\n ctx.save()\n savedContextForTransform = true\n const originXRaw = transform.originX ?? '50%'\n const originYRaw = transform.originY ?? '50%'\n const originOffsetX = parsePercentage(originXRaw, width)\n const originOffsetY = parsePercentage(originYRaw, height)\n const originAbsX = x + originOffsetX\n const originAbsY = y + originOffsetY\n ctx.translate(originAbsX, originAbsY)\n if (transform.translateX || transform.translateY) {\n const tx = parsePercentage(transform.translateX, width)\n const ty = parsePercentage(transform.translateY, height)\n if (tx !== 0 || ty !== 0) ctx.translate(tx, ty)\n }\n if (transform.rotate) {\n ctx.rotate((transform.rotate * Math.PI) / 180)\n }\n if (transform.scale || transform.scaleX || transform.scaleY) {\n const scaleX = transform.scaleX ?? transform.scale ?? 1\n const scaleY = transform.scaleY ?? transform.scale ?? 1\n if (scaleX !== 1 || scaleY !== 1) ctx.scale(scaleX, scaleY)\n }\n ctx.translate(-originAbsX, -originAbsY)\n }\n // --- End Transformation Setup ---\n\n // --- Step 1: Render Parent Background/Borders/Content ---\n // This renders the current node's own visual appearance first.\n this._renderContent(ctx, x, y, width, height)\n\n // --- Step 2: Prepare Children for Stacking ---\n const positionedChildren: { node: BoxNode; zIndex: number; originalIndex: number }[] = []\n const inFlowChildren: BoxNode[] = []\n\n this.children.forEach((child, index) => {\n // Check if child participates in zIndex stacking\n if (child.props.positionType === Style.PositionType.Absolute && child.props.zIndex !== undefined) {\n positionedChildren.push({\n node: child,\n zIndex: child.props.zIndex,\n originalIndex: index, // Keep original order for tie-breaking\n })\n } else {\n inFlowChildren.push(child)\n }\n })\n\n // Sort positioned children by zIndex, then by original order\n positionedChildren.sort((a, b) => {\n return a.zIndex - b.zIndex || a.originalIndex - b.originalIndex\n })\n\n // --- Step 3: Handle Clipping (Applies before drawing children) ---\n let savedContextForClip = false\n if (this.props.overflow === Style.Overflow.Hidden && (width > 0 || height > 0)) {\n ctx.save()\n savedContextForClip = true\n const borderLeft = this.node.getComputedBorder(Style.Edge.Left)\n const borderTop = this.node.getComputedBorder(Style.Edge.Top)\n const borderRight = this.node.getComputedBorder(Style.Edge.Right)\n const borderBottom = this.node.getComputedBorder(Style.Edge.Bottom)\n const innerX = x + borderLeft\n const innerY = y + borderTop\n const innerWidth = Math.max(0, width - borderLeft - borderRight)\n const innerHeight = Math.max(0, height - borderTop - borderBottom)\n const outerRadii = parseBorderRadius(this.props.borderRadius)\n const innerRadii = {\n TopLeft: Math.max(0, outerRadii.TopLeft - Math.max(borderLeft, borderTop)),\n TopRight: Math.max(0, outerRadii.TopRight - Math.max(borderRight, borderTop)),\n BottomRight: Math.max(0, outerRadii.BottomRight - Math.max(borderRight, borderBottom)),\n BottomLeft: Math.max(0, outerRadii.BottomLeft - Math.max(borderLeft, borderBottom)),\n }\n if (innerWidth > 0 && innerHeight > 0) {\n drawRoundedRectPath(ctx, innerX, innerY, innerWidth, innerHeight, innerRadii)\n ctx.clip()\n } else {\n ctx.beginPath()\n ctx.rect(innerX, innerY, 0, 0)\n ctx.clip()\n }\n }\n // --- End Clipping Setup ---\n\n // --- Step 4: Render Children in Stacking Order ---\n\n // 4a: Render positioned children with negative zIndex\n for (const item of positionedChildren) {\n if (item.zIndex < 0) {\n // Pass parent's layout origin (x, y) as offset\n item.node.render(ctx, x, y)\n }\n }\n\n // 4b: Render in-flow children (recursively)\n for (const child of inFlowChildren) {\n // Pass parent's layout origin (x, y) as offset\n child.render(ctx, x, y)\n }\n\n // 4c: Render positioned children with zero or positive zIndex\n for (const item of positionedChildren) {\n if (item.zIndex >= 0) {\n // Pass parent's layout origin (x, y) as offset\n item.node.render(ctx, x, y)\n }\n }\n // --- End Child Rendering ---\n\n // --- Step 5: Restore Clipping Context ---\n if (savedContextForClip) {\n ctx.restore()\n }\n // --- End Clipping Restoration ---\n\n // --- Step 6: Restore Transformation Context ---\n if (savedContextForTransform) {\n ctx.restore()\n }\n // --- End Transformation Restoration ---\n } finally {\n // --- Opacity Restoration ---\n if (appliedOpacity && originalAlpha !== undefined) {\n ctx.globalAlpha = originalAlpha\n }\n // --- End Opacity Restoration ---\n }\n }\n\n /**\n * Renders the node's visual content including background fills, shadows, and borders.\n * This is an internal method used by the render() pipeline.\n *\n * @param ctx - The skia-canvas 2D rendering context to draw into\n * @param x - The absolute x-coordinate where drawing should begin\n * @param y - The absolute y-coordinate where drawing should begin\n * @param width - The width of the content area to render\n * @param height - The height of the content area to render\n */\n protected _renderContent(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number) {\n // Calculate border radius values for all corners\n const radii = { TopLeft: 0, TopRight: 0, BottomRight: 0, BottomLeft: 0 }\n if (this.props.borderRadius) {\n // Handle both number and object border radius specifications\n if (typeof this.props.borderRadius === 'number') {\n radii.TopLeft = radii.TopRight = radii.BottomRight = radii.BottomLeft = this.props.borderRadius\n } else {\n // Extract individual corner radii, defaulting to 0 if not specified\n radii.TopLeft = this.props.borderRadius.TopLeft ?? 0\n radii.TopRight = this.props.borderRadius.TopRight ?? 0\n radii.BottomRight = this.props.borderRadius.BottomRight ?? 0\n radii.BottomLeft = this.props.borderRadius.BottomLeft ?? 0\n }\n // Ensure all radii are non-negative\n radii.TopLeft = Math.max(0, radii.TopLeft)\n radii.TopRight = Math.max(0, radii.TopRight)\n radii.BottomRight = Math.max(0, radii.BottomRight)\n radii.BottomLeft = Math.max(0, radii.BottomLeft)\n }\n\n // Process shadow configurations\n let shadows: BoxShadowProps[] = []\n if (this.props.boxShadow) {\n shadows = Array.isArray(this.props.boxShadow) ? this.props.boxShadow : [this.props.boxShadow]\n }\n // Split shadows into outset (normal) and inset types\n const outsetShadows = shadows.filter(s => !s.inset)\n const insetShadows = shadows.filter(s => s.inset)\n\n // Determine if background is fully opaque for shadow optimization\n const backgroundColor = this.props.backgroundColor\n let isOpaque = false\n if (backgroundColor && !this.props.gradient) {\n const rgba = tinycolor(backgroundColor).toRgb()\n isOpaque = rgba && rgba.a === 1\n }\n\n // Render outset shadows if present\n if (outsetShadows.length > 0) {\n const subtractOffset = 0.75\n if (isOpaque) {\n // Optimized rendering path for opaque backgrounds\n ctx.save()\n ctx.fillStyle = 'black' // Shadow source color\n for (const shadow of outsetShadows) {\n ctx.shadowColor = shadow.color ?? 'black'\n ctx.shadowOffsetX = shadow.offsetX ?? 0\n ctx.shadowOffsetY = shadow.offsetY ?? 0\n ctx.shadowBlur = shadow.blur ?? Math.max(shadow.offsetX ?? 0, shadow.offsetY ?? 0)\n drawRoundedRectPath(\n ctx,\n x + subtractOffset / 2,\n y + subtractOffset / 2,\n width - subtractOffset,\n height - subtractOffset,\n radii,\n )\n ctx.fill()\n }\n ctx.restore()\n } else {\n // Complex shadow rendering for transparent/gradient backgrounds\n let maxBlur = 0\n let maxOffsetX = 0\n let maxOffsetY = 0\n\n // Calculate maximum shadow extents\n for (const shadow of outsetShadows) {\n const currentOffsetX = shadow.offsetX ?? 0\n const currentOffsetY = shadow.offsetY ?? 0\n const currentBlur = shadow.blur ?? Math.max(currentOffsetX, currentOffsetY)\n maxBlur = Math.max(maxBlur, currentBlur)\n maxOffsetX = Math.max(maxOffsetX, Math.abs(currentOffsetX))\n maxOffsetY = Math.max(maxOffsetY, Math.abs(currentOffsetY))\n }\n\n // Calculate offscreen canvas size with padding for shadows\n const blurPaddingMultiplier = 2\n const shadowPadding = Math.ceil(maxBlur * blurPaddingMultiplier + Math.max(maxOffsetX, maxOffsetY))\n const offscreenWidth = Math.ceil(width + shadowPadding * 2)\n const offscreenHeight = Math.ceil(height + shadowPadding * 2)\n\n if (offscreenWidth > 0 && offscreenHeight > 0) {\n // Create temporary canvas for shadow composition\n const offscreenCanvas = new Canvas(offscreenWidth, offscreenHeight)\n const offCtx = offscreenCanvas.getContext('2d')\n offCtx.imageSmoothingEnabled = true\n offCtx.imageSmoothingQuality = 'high'\n const shapeOffsetX = shadowPadding\n const shapeOffsetY = shadowPadding\n\n // Render each shadow individually onto offscreen canvas\n for (const shadow of outsetShadows) {\n offCtx.save()\n const shadowOffsetX = shadow.offsetX ?? 0\n const shadowOffsetY = shadow.offsetY ?? 0\n const blur = shadow.blur ?? Math.max(shadowOffsetX, shadowOffsetY)\n offCtx.shadowColor = shadow.color ?? 'black'\n offCtx.shadowOffsetX = shadowOffsetX\n offCtx.shadowOffsetY = shadowOffsetY\n offCtx.shadowBlur = Math.max(0, blur)\n drawRoundedRectPath(\n offCtx,\n shapeOffsetX + subtractOffset / 2,\n shapeOffsetY + subtractOffset / 2,\n width - subtractOffset,\n height - subtractOffset,\n radii,\n )\n offCtx.fillStyle = 'rgba(0,0,0,1)'\n offCtx.fill()\n offCtx.restore()\n }\n\n // Cut out the shape from accumulated shadows\n offCtx.save()\n offCtx.globalCompositeOperation = 'destination-out'\n drawRoundedRectPath(offCtx, shapeOffsetX, shapeOffsetY, width, height, radii)\n offCtx.fillStyle = 'rgba(0,0,0,1)'\n offCtx.fill()\n offCtx.restore()\n\n // Composite shadow result onto main canvas\n ctx.drawImage(offscreenCanvas, x - shadowPadding, y - shadowPadding)\n }\n }\n }\n\n // Render background fill (solid color or gradient)\n // This logic uses standard context methods and remains unchanged.\n const hasFill = this.props.gradient || this.props.backgroundColor\n if (hasFill) {\n let fillStyle: string | CanvasGradient = this.props.backgroundColor || 'transparent'\n if (this.props.gradient) {\n const { type = 'linear', colors, direction = 'to-bottom' } = this.props.gradient\n let grad: CanvasGradient | null = null\n if (colors && colors.length > 0 && width > 0 && height > 0) {\n if (type === 'linear') {\n let x0 = 0,\n y0 = 0,\n x1 = 0,\n y1 = 0\n let directionIsValid = false\n if (Array.isArray(direction) && direction.length === 4) {\n ;[x0, y0, x1, y1] = direction\n directionIsValid = true\n } else if (typeof direction === 'string') {\n switch (direction.toLowerCase()) {\n case 'to-right':\n x0 = 0\n y0 = 0\n x1 = width\n y1 = 0\n directionIsValid = true\n break\n case 'to-left':\n x0 = width\n y0 = 0\n x1 = 0\n y1 = 0\n directionIsValid = true\n break\n case 'to-bottom':\n x0 = 0\n y0 = 0\n x1 = 0\n y1 = height\n directionIsValid = true\n break\n case 'to-top':\n x0 = 0\n y0 = height\n x1 = 0\n y1 = 0\n directionIsValid = true\n break\n case 'to-top-right':\n x0 = 0\n y0 = height\n x1 = width\n y1 = 0\n directionIsValid = true\n break\n case 'to-top-left':\n x0 = width\n y0 = height\n x1 = 0\n y1 = 0\n directionIsValid = true\n break\n case 'to-bottom-right':\n x0 = 0\n y0 = 0\n x1 = width\n y1 = height\n directionIsValid = true\n break\n case 'to-bottom-left':\n x0 = width\n y0 = 0\n x1 = 0\n y1 = height\n directionIsValid = true\n break\n }\n }\n if (directionIsValid) {\n grad = ctx.createLinearGradient(x + x0, y + y0, x + x1, y + y1)\n } else {\n console.warn(`[BoxNode ${this.key}] Invalid linear gradient direction:`, direction)\n }\n } else if (type === 'radial') {\n const centerX = x + width / 2\n const centerY = y + height / 2\n const r0 = 0\n const r1 = 0.5 * Math.sqrt(width * width + height * height)\n if (r1 > 0) {\n grad = ctx.createRadialGradient(centerX, centerY, r0, centerX, centerY, r1)\n }\n }\n if (grad) {\n colors.forEach((color, i) => {\n const stop = colors.length > 1 ? Math.max(0, Math.min(1, i / (colors.length - 1))) : 0.5\n grad!.addColorStop(stop, color)\n })\n fillStyle = grad\n } else {\n console.warn(`[BoxNode ${this.key}] Could not create ${type} gradient. Falling back to backgroundColor.`)\n }\n } else {\n if (!colors?.length) {\n console.warn(\n `[BoxNode ${this.key}] Gradient specified but no colors provided. Falling back to backgroundColor.`,\n )\n } else {\n console.warn(`[BoxNode ${this.key}] Cannot draw gradient with zero width/height.`)\n }\n }\n }\n if (fillStyle && fillStyle !== 'transparent') {\n ctx.fillStyle = fillStyle\n drawRoundedRectPath(ctx, x, y, width, height, radii)\n ctx.fill()\n }\n }\n\n // Render inset shadows\n // This logic uses standard context methods and remains unchanged.\n if (insetShadows.length > 0) {\n for (const shadow of insetShadows) {\n ctx.save()\n const color = shadow.color ?? 'black'\n const shadowOffsetX = shadow.offsetX ?? 0\n const shadowOffsetY = shadow.offsetY ?? 0\n const blur = shadow.blur ?? Math.max(shadowOffsetX, shadowOffsetY)\n drawRoundedRectPath(ctx, x, y, width, height, radii)\n ctx.clip()\n ctx.shadowColor = color\n ctx.shadowOffsetX = shadowOffsetX\n ctx.shadowOffsetY = shadowOffsetY\n ctx.shadowBlur = blur\n ctx.lineWidth = 1 // Minimal line width for the stroke.\n ctx.strokeStyle = 'transparent' // Stroke color doesn't matter; only the shadow does.\n // Draw a slightly offset path *inside* the clip to generate the inset shadow.\n drawRoundedRectPath(ctx, x - shadowOffsetX, y - shadowOffsetY, width, height, radii)\n ctx.stroke() // The stroke generates the shadow inside the clipped area.\n ctx.restore()\n }\n }\n\n // Render border strokes\n // (This logic uses standard context methods via drawBorders helper and remains unchanged)\n drawBorders({\n ctx,\n node: this.node,\n x,\n y,\n width,\n height,\n radii,\n borderColor: this.props.borderColor,\n borderStyle: this.props.borderStyle,\n })\n }\n}\n\n/**\n * Creates a new BoxNode instance.\n * @param {BoxProps} props - Box properties and configuration.\n * @returns {BoxNode} New BoxNode instance.\n */\nexport const Box = (props: BoxProps) => new BoxNode(props)\n\n/**\n * @class ColumnNode\n * Node class for vertical column layout\n */\nexport class ColumnNode extends BoxNode {\n constructor(props: BoxProps & BaseProps = {}) {\n super({\n display: Style.Display.Flex,\n flexDirection: Style.FlexDirection.Column,\n flexShrink: 1,\n flexBasis: props.flexGrow === 1 ? 0 : undefined,\n ...props,\n })\n }\n}\n\n/**\n * Creates a new ColumnNode instance.\n * @param {BoxProps} props - Column properties and configuration.\n * @returns {ColumnNode} New ColumnNode instance.\n */\nexport const Column = (props: BoxProps) => new ColumnNode(props)\n\n/**\n * @class RowNode\n * @classdesc Node class for horizontal row layout.\n */\nexport class RowNode extends BoxNode {\n constructor(props: BoxProps & BaseProps = {}) {\n super({\n name: 'Row',\n display: Style.Display.Flex,\n flexDirection: Style.FlexDirection.Row,\n flexShrink: 1, // Default shrink for rows\n ...props,\n })\n }\n}\n\n/**\n * Creates a new RowNode instance.\n * @param {BoxProps} props - Row properties and configuration.\n * @returns {RowNode} New RowNode instance.\n */\nexport const Row = (props: BoxProps) => new RowNode(props)\n"],"names":["Yoga","Style","omit","parsePercentage","parseBorderRadius","drawRoundedRectPath","Canvas","drawBorders"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout.canvas.util.js","sources":["../../../../src/canvas/layout.canvas.util.ts"],"sourcesContent":["import { Canvas, type CanvasRenderingContext2D } from 'skia-canvas'\nimport { drawBorders, drawRoundedRectPath, parseBorderRadius, parsePercentage } from '@/canvas/canvas.helper.js'\nimport type { BaseProps, BoxProps, BoxShadowProps } from '@/canvas/canvas.type.js'\nimport { omit } from 'lodash-es'\nimport tinycolor from 'tinycolor2'\nimport Yoga, { Style, Node } from '@/constant/common.const.js'\n\n/**\n * @class BoxNode\n * @classdesc Base node class for rendering rectangular boxes with layout, styling, and children.\n * It uses the Yoga layout engine for positioning and sizing.\n */\nexport class BoxNode {\n /**\n * @property {Partial<BoxProps>} initialProps - Original props passed to the constructor before any modifications.\n */\n initialProps: Partial<BoxProps>\n\n /**\n * @property {Node} node - The Yoga layout engine node.\n */\n node: Node\n\n /**\n * @property {BoxNode[]} children - Child nodes.\n */\n children: BoxNode[]\n\n /**\n * @property {BoxProps & BaseProps} props - Current props including defaults and inherited values.\n */\n props: BoxProps & BaseProps\n\n /**\n * @property {string} name - Node type name.\n */\n readonly name?: string\n\n /**\n * @property {string} key - Unique node identifier.\n */\n key?: string\n\n /**\n * Creates a new BoxNode instance\n * @param props Initial box properties and styling\n */\n constructor(props: BoxProps & BaseProps = {}) {\n const children = (Array.isArray(props?.children) ? props.children : [props.children]).filter(child => child)\n this.initialProps = { ...props, children }\n this.node = Yoga.Node.create()\n this.children = []\n\n this.props = {\n key: this.key,\n borderColor: 'black',\n borderStyle: Style.Border.Solid,\n boxSizing: Style.BoxSizing.BorderBox,\n opacity: 1,\n flexShrink: 1,\n ...this.initialProps,\n }\n this.name = this.props.name || 'Box'\n this.key = this.props.key || `${this.name}-0`\n\n this.setLayout(this.props)\n }\n\n /**\n * Processes and appends any children passed in the initial props.\n */\n public processInitialChildren() {\n if (this.props.children) {\n const childrenToAdd = Array.isArray(this.props.children) ? this.props.children : [this.props.children]\n childrenToAdd.forEach((child, index) => {\n if (child) {\n this.appendChild(child, index)\n }\n })\n }\n }\n\n /**\n * Inherits styles from the parent node.\n * @param {BoxProps & BaseProps} parentProps Parent node properties to inherit from.\n */\n protected resolveInheritedStyles(parentProps: BoxProps & BaseProps) {\n if (parentProps.key) {\n this.key = `${parentProps.key}-${this.key}`\n this.props.key = this.key\n }\n\n const inheritableKeys = [\n 'fontSize',\n 'fontFamily',\n 'fontWeight',\n 'fontStyle',\n 'color',\n 'textAlign',\n 'verticalAlign',\n 'lineHeight',\n 'lineGap',\n 'letterSpacing',\n 'wordSpacing',\n 'textDecoration',\n 'maxLines',\n 'fontVariant',\n ]\n\n for (const key of inheritableKeys) {\n if (this.initialProps[key] === undefined && parentProps[key] !== undefined) {\n this.props[key] = parentProps[key]\n }\n }\n\n if (!this.node.isDirty()) {\n this.node.markDirty()\n }\n }\n\n /**\n * Applies node type-specific default values after inheritance.\n */\n protected applyDefaults(): void {\n // Base implementation does nothing; subclasses can override.\n }\n\n /**\n * Appends a child node at the specified index.\n * @param {BoxNode} child Child node to append.\n * @param index Index to insert child at\n */\n protected appendChild(child: BoxNode, index: number) {\n if (!child || !child.node) {\n console.warn('Attempted to append an invalid child node.', child)\n return\n }\n\n child.resolveInheritedStyles(omit(this.props, 'children'))\n child.applyDefaults()\n this.children.push(child)\n this.node.insertChild(child.node, index)\n child.processInitialChildren()\n }\n\n /**\n * Performs final layout adjustments recursively after the main layout calculation.\n * @returns {boolean} Whether any node was marked as dirty during finalization.\n */\n public finalizeLayout(): boolean {\n let wasDirty = false\n this.updateLayoutBasedOnComputedSize()\n if (this.node.isDirty()) {\n wasDirty = true\n }\n\n for (const child of this.children) {\n child.finalizeLayout()\n if (child.node.isDirty()) {\n wasDirty = true\n }\n }\n\n return wasDirty\n }\n\n /**\n * Hook for subclasses to update layout based on computed size.\n */\n protected updateLayoutBasedOnComputedSize() {\n // Base implementation does nothing; subclasses can override.\n }\n\n /**\n * Applies layout properties to the Yoga node.\n * @param props Box properties containing layout values\n */\n protected setLayout(props: BoxProps) {\n // --- Yoga layout property application ---\n // (This entire block remains unchanged as it interacts with Yoga, not the canvas library)\n const {\n width,\n height,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flexDirection,\n justifyContent,\n alignItems,\n alignSelf,\n alignContent,\n flexGrow,\n flexShrink,\n flexBasis,\n positionType,\n position,\n gap,\n margin,\n padding,\n border,\n aspectRatio,\n overflow,\n display,\n boxSizing = Style.BoxSizing.BorderBox,\n direction = Style.Direction.LTR,\n flexWrap,\n } = props\n\n if (width !== undefined) this.node.setWidth(width)\n if (height !== undefined) this.node.setHeight(height)\n if (minWidth !== undefined) this.node.setMinWidth(minWidth)\n if (minHeight !== undefined) this.node.setMinHeight(minHeight)\n if (maxWidth !== undefined) this.node.setMaxWidth(maxWidth)\n if (maxHeight !== undefined) this.node.setMaxHeight(maxHeight)\n if (flexDirection !== undefined) this.node.setFlexDirection(flexDirection)\n if (justifyContent !== undefined) this.node.setJustifyContent(justifyContent)\n if (alignItems !== undefined) this.node.setAlignItems(alignItems)\n if (alignSelf !== undefined) this.node.setAlignSelf(alignSelf)\n if (alignContent !== undefined) this.node.setAlignContent(alignContent)\n if (flexGrow !== undefined) this.node.setFlexGrow(flexGrow)\n if (flexShrink !== undefined) this.node.setFlexShrink(flexShrink)\n if (positionType !== undefined) this.node.setPositionType(positionType)\n if (flexBasis !== undefined) this.node.setFlexBasis(flexBasis)\n if (position) {\n if (typeof position === 'number') {\n this.node.setPosition(Style.Edge.All, position)\n } else if (typeof position === 'string' && position.endsWith('%')) {\n this.node.setPositionPercent(Style.Edge.All, parseFloat(position))\n } else {\n for (const [edge, value] of Object.entries(position)) {\n if (edge in Style.Edge) {\n if (typeof value === 'string' && value.endsWith('%')) {\n this.node.setPositionPercent(Style.Edge[edge], parseFloat(value))\n } else {\n this.node.setPosition(Style.Edge[edge], value as number)\n }\n }\n }\n }\n }\n if (gap) {\n if (typeof gap === 'number') {\n this.node.setGap(Style.Gutter.All, gap)\n } else if (typeof gap === 'string' && gap.endsWith('%')) {\n this.node.setGapPercent(Style.Gutter.All, parseFloat(gap))\n } else {\n for (const [gutter, value] of Object.entries(gap)) {\n if (gutter in Style.Gutter) {\n if (typeof value === 'string' && value.endsWith('%')) {\n this.node.setGapPercent(Style.Gutter[gutter], parseFloat(value))\n } else {\n this.node.setGap(Style.Gutter[gutter], value as number)\n }\n }\n }\n }\n }\n if (margin) {\n if (typeof margin === 'number' || margin === 'auto') {\n this.node.setMargin(Style.Edge.All, margin)\n } else if (typeof margin === 'string' && margin.endsWith('%')) {\n this.node.setMarginPercent(Style.Edge.All, parseFloat(margin))\n } else {\n for (const [edge, value] of Object.entries(margin)) {\n if (edge in Style.Edge) {\n if (typeof value === 'string' && value.endsWith('%')) {\n this.node.setMarginPercent(Style.Edge[edge], parseFloat(value))\n } else {\n this.node.setMargin(Style.Edge[edge], value as number)\n }\n }\n }\n }\n }\n if (padding) {\n if (typeof padding === 'number') {\n this.node.setPadding(Style.Edge.All, padding)\n } else if (typeof padding === 'string' && padding.endsWith('%')) {\n this.node.setPaddingPercent(Style.Edge.All, parseFloat(padding))\n } else {\n for (const [edge, value] of Object.entries(padding)) {\n if (edge in Style.Edge) {\n if (typeof value === 'string' && value.endsWith('%')) {\n this.node.setPaddingPercent(Style.Edge[edge], parseFloat(value))\n } else {\n this.node.setPadding(Style.Edge[edge], value as number)\n }\n }\n }\n }\n }\n if (border) {\n if (typeof border === 'number') {\n this.node.setBorder(Style.Edge.All, border)\n } else {\n for (const [edge, value] of Object.entries(border)) {\n if (edge in Style.Edge) this.node.setBorder(Style.Edge[edge], value)\n }\n }\n }\n if (aspectRatio !== undefined) this.node.setAspectRatio(aspectRatio)\n if (overflow !== undefined) this.node.setOverflow(overflow)\n if (display !== undefined) this.node.setDisplay(display)\n if (boxSizing !== undefined) this.node.setBoxSizing(boxSizing)\n if (direction !== undefined) this.node.setDirection(direction)\n if (flexWrap !== undefined) this.node.setFlexWrap(flexWrap)\n // --- End Yoga layout property application ---\n }\n\n /**\n * Renders the node and its children to the canvas.\n * @param {CanvasRenderingContext2D} ctx Canvas rendering context (from skia-canvas).\n * @param {number} offsetX X offset for rendering.\n * @param {number} offsetY Y offset for rendering.\n */\n render(ctx: CanvasRenderingContext2D, offsetX: number = 0, offsetY: number = 0) {\n const layout = this.node.getComputedLayout()\n const x = layout.left + offsetX\n const y = layout.top + offsetY\n const width = layout.width\n const height = layout.height\n\n // Exit early if the node is invisible or has no dimensions.\n if (width <= 0 || height <= 0 || this.props.display === Style.Display.None) {\n return\n }\n\n // --- Opacity Setup ---\n const desiredOpacity = Math.max(0, Math.min(1, this.props.opacity ?? 1))\n let originalAlpha: number | undefined = undefined\n let appliedOpacity = false\n if (desiredOpacity < 1) {\n originalAlpha = ctx.globalAlpha\n ctx.globalAlpha = originalAlpha * desiredOpacity\n appliedOpacity = true\n }\n // --- End Opacity Setup ---\n\n try {\n // --- Transformation Setup ---\n const transform = this.props.transform\n const needsTransform =\n transform && (transform.translateX || transform.translateY || transform.rotate || transform.scale || transform.scaleX || transform.scaleY)\n\n let savedContextForTransform = false\n if (needsTransform) {\n ctx.save()\n savedContextForTransform = true\n const originXRaw = transform.originX ?? '50%'\n const originYRaw = transform.originY ?? '50%'\n const originOffsetX = parsePercentage(originXRaw, width)\n const originOffsetY = parsePercentage(originYRaw, height)\n const originAbsX = x + originOffsetX\n const originAbsY = y + originOffsetY\n ctx.translate(originAbsX, originAbsY)\n if (transform.translateX || transform.translateY) {\n const tx = parsePercentage(transform.translateX, width)\n const ty = parsePercentage(transform.translateY, height)\n if (tx !== 0 || ty !== 0) ctx.translate(tx, ty)\n }\n if (transform.rotate) {\n ctx.rotate((transform.rotate * Math.PI) / 180)\n }\n if (transform.scale || transform.scaleX || transform.scaleY) {\n const scaleX = transform.scaleX ?? transform.scale ?? 1\n const scaleY = transform.scaleY ?? transform.scale ?? 1\n if (scaleX !== 1 || scaleY !== 1) ctx.scale(scaleX, scaleY)\n }\n ctx.translate(-originAbsX, -originAbsY)\n }\n // --- End Transformation Setup ---\n\n // --- Step 1: Render Parent Background/Borders/Content ---\n // This renders the current node's own visual appearance first.\n this._renderContent(ctx, x, y, width, height)\n\n // --- Step 2: Prepare Children for Stacking ---\n const positionedChildren: { node: BoxNode; zIndex: number; originalIndex: number }[] = []\n const inFlowChildren: BoxNode[] = []\n\n this.children.forEach((child, index) => {\n // Check if child participates in zIndex stacking\n if (child.props.positionType === Style.PositionType.Absolute && child.props.zIndex !== undefined) {\n positionedChildren.push({\n node: child,\n zIndex: child.props.zIndex,\n originalIndex: index, // Keep original order for tie-breaking\n })\n } else {\n inFlowChildren.push(child)\n }\n })\n\n // Sort positioned children by zIndex, then by original order\n positionedChildren.sort((a, b) => {\n return a.zIndex - b.zIndex || a.originalIndex - b.originalIndex\n })\n\n // --- Step 3: Handle Clipping (Applies before drawing children) ---\n let savedContextForClip = false\n if (this.props.overflow === Style.Overflow.Hidden && (width > 0 || height > 0)) {\n ctx.save()\n savedContextForClip = true\n const borderLeft = this.node.getComputedBorder(Style.Edge.Left)\n const borderTop = this.node.getComputedBorder(Style.Edge.Top)\n const borderRight = this.node.getComputedBorder(Style.Edge.Right)\n const borderBottom = this.node.getComputedBorder(Style.Edge.Bottom)\n const innerX = x + borderLeft\n const innerY = y + borderTop\n const innerWidth = Math.max(0, width - borderLeft - borderRight)\n const innerHeight = Math.max(0, height - borderTop - borderBottom)\n const outerRadii = parseBorderRadius(this.props.borderRadius)\n const innerRadii = {\n TopLeft: Math.max(0, outerRadii.TopLeft - Math.max(borderLeft, borderTop)),\n TopRight: Math.max(0, outerRadii.TopRight - Math.max(borderRight, borderTop)),\n BottomRight: Math.max(0, outerRadii.BottomRight - Math.max(borderRight, borderBottom)),\n BottomLeft: Math.max(0, outerRadii.BottomLeft - Math.max(borderLeft, borderBottom)),\n }\n if (innerWidth > 0 && innerHeight > 0) {\n drawRoundedRectPath(ctx, innerX, innerY, innerWidth, innerHeight, innerRadii)\n ctx.clip()\n } else {\n ctx.beginPath()\n ctx.rect(innerX, innerY, 0, 0)\n ctx.clip()\n }\n }\n // --- End Clipping Setup ---\n\n // --- Step 4: Render Children in Stacking Order ---\n\n // 4a: Render positioned children with negative zIndex\n for (const item of positionedChildren) {\n if (item.zIndex < 0) {\n // Pass parent's layout origin (x, y) as offset\n item.node.render(ctx, x, y)\n }\n }\n\n // 4b: Render in-flow children (recursively)\n for (const child of inFlowChildren) {\n // Pass parent's layout origin (x, y) as offset\n child.render(ctx, x, y)\n }\n\n // 4c: Render positioned children with zero or positive zIndex\n for (const item of positionedChildren) {\n if (item.zIndex >= 0) {\n // Pass parent's layout origin (x, y) as offset\n item.node.render(ctx, x, y)\n }\n }\n // --- End Child Rendering ---\n\n // --- Step 5: Restore Clipping Context ---\n if (savedContextForClip) {\n ctx.restore()\n }\n // --- End Clipping Restoration ---\n\n // --- Step 6: Restore Transformation Context ---\n if (savedContextForTransform) {\n ctx.restore()\n }\n // --- End Transformation Restoration ---\n } finally {\n // --- Opacity Restoration ---\n if (appliedOpacity && originalAlpha !== undefined) {\n ctx.globalAlpha = originalAlpha\n }\n // --- End Opacity Restoration ---\n }\n }\n\n /**\n * Renders the node's visual content including background fills, shadows, and borders.\n * This is an internal method used by the render() pipeline.\n * @param ctx The skia-canvas 2D rendering context to draw into\n * @param x The absolute x-coordinate where drawing should begin\n * @param y The absolute y-coordinate where drawing should begin\n * @param width The width of the content area to render\n * @param height The height of the content area to render\n */\n protected _renderContent(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number) {\n // Calculate border radius values for all corners\n const radii = { TopLeft: 0, TopRight: 0, BottomRight: 0, BottomLeft: 0 }\n if (this.props.borderRadius) {\n // Handle both number and object border radius specifications\n if (typeof this.props.borderRadius === 'number') {\n radii.TopLeft = radii.TopRight = radii.BottomRight = radii.BottomLeft = this.props.borderRadius\n } else {\n // Extract individual corner radii, defaulting to 0 if not specified\n radii.TopLeft = this.props.borderRadius.TopLeft ?? 0\n radii.TopRight = this.props.borderRadius.TopRight ?? 0\n radii.BottomRight = this.props.borderRadius.BottomRight ?? 0\n radii.BottomLeft = this.props.borderRadius.BottomLeft ?? 0\n }\n // Ensure all radii are non-negative\n radii.TopLeft = Math.max(0, radii.TopLeft)\n radii.TopRight = Math.max(0, radii.TopRight)\n radii.BottomRight = Math.max(0, radii.BottomRight)\n radii.BottomLeft = Math.max(0, radii.BottomLeft)\n }\n\n // Process shadow configurations\n let shadows: BoxShadowProps[] = []\n if (this.props.boxShadow) {\n shadows = Array.isArray(this.props.boxShadow) ? this.props.boxShadow : [this.props.boxShadow]\n }\n // Split shadows into outset (normal) and inset types\n const outsetShadows = shadows.filter(s => !s.inset)\n const insetShadows = shadows.filter(s => s.inset)\n\n // Determine if background is fully opaque for shadow optimization\n const backgroundColor = this.props.backgroundColor\n let isOpaque = false\n if (backgroundColor && !this.props.gradient) {\n const rgba = tinycolor(backgroundColor).toRgb()\n isOpaque = rgba && rgba.a === 1\n }\n\n // Render outset shadows if present\n if (outsetShadows.length > 0) {\n const subtractOffset = 0.75\n if (isOpaque) {\n // Optimized rendering path for opaque backgrounds\n ctx.save()\n ctx.fillStyle = 'black' // Shadow source color\n for (const shadow of outsetShadows) {\n ctx.shadowColor = shadow.color ?? 'black'\n ctx.shadowOffsetX = shadow.offsetX ?? 0\n ctx.shadowOffsetY = shadow.offsetY ?? 0\n ctx.shadowBlur = shadow.blur ?? Math.max(shadow.offsetX ?? 0, shadow.offsetY ?? 0)\n drawRoundedRectPath(ctx, x + subtractOffset / 2, y + subtractOffset / 2, width - subtractOffset, height - subtractOffset, radii)\n ctx.fill()\n }\n ctx.restore()\n } else {\n // Complex shadow rendering for transparent/gradient backgrounds\n let maxBlur = 0\n let maxOffsetX = 0\n let maxOffsetY = 0\n\n // Calculate maximum shadow extents\n for (const shadow of outsetShadows) {\n const currentOffsetX = shadow.offsetX ?? 0\n const currentOffsetY = shadow.offsetY ?? 0\n const currentBlur = shadow.blur ?? Math.max(currentOffsetX, currentOffsetY)\n maxBlur = Math.max(maxBlur, currentBlur)\n maxOffsetX = Math.max(maxOffsetX, Math.abs(currentOffsetX))\n maxOffsetY = Math.max(maxOffsetY, Math.abs(currentOffsetY))\n }\n\n // Calculate offscreen canvas size with padding for shadows\n const blurPaddingMultiplier = 2\n const shadowPadding = Math.ceil(maxBlur * blurPaddingMultiplier + Math.max(maxOffsetX, maxOffsetY))\n const offscreenWidth = Math.ceil(width + shadowPadding * 2)\n const offscreenHeight = Math.ceil(height + shadowPadding * 2)\n\n if (offscreenWidth > 0 && offscreenHeight > 0) {\n // Create temporary canvas for shadow composition\n const offscreenCanvas = new Canvas(offscreenWidth, offscreenHeight)\n const offCtx = offscreenCanvas.getContext('2d')\n offCtx.imageSmoothingEnabled = true\n offCtx.imageSmoothingQuality = 'high'\n const shapeOffsetX = shadowPadding\n const shapeOffsetY = shadowPadding\n\n // Render each shadow individually onto offscreen canvas\n for (const shadow of outsetShadows) {\n offCtx.save()\n const shadowOffsetX = shadow.offsetX ?? 0\n const shadowOffsetY = shadow.offsetY ?? 0\n const blur = shadow.blur ?? Math.max(shadowOffsetX, shadowOffsetY)\n offCtx.shadowColor = shadow.color ?? 'black'\n offCtx.shadowOffsetX = shadowOffsetX\n offCtx.shadowOffsetY = shadowOffsetY\n offCtx.shadowBlur = Math.max(0, blur)\n drawRoundedRectPath(\n offCtx,\n shapeOffsetX + subtractOffset / 2,\n shapeOffsetY + subtractOffset / 2,\n width - subtractOffset,\n height - subtractOffset,\n radii,\n )\n offCtx.fillStyle = 'rgba(0,0,0,1)'\n offCtx.fill()\n offCtx.restore()\n }\n\n // Cut out the shape from accumulated shadows\n offCtx.save()\n offCtx.globalCompositeOperation = 'destination-out'\n drawRoundedRectPath(offCtx, shapeOffsetX, shapeOffsetY, width, height, radii)\n offCtx.fillStyle = 'rgba(0,0,0,1)'\n offCtx.fill()\n offCtx.restore()\n\n // Composite shadow result onto main canvas\n ctx.drawImage(offscreenCanvas, x - shadowPadding, y - shadowPadding)\n }\n }\n }\n\n // Render background fill (solid color or gradient)\n // This logic uses standard context methods and remains unchanged.\n const hasFill = this.props.gradient || this.props.backgroundColor\n if (hasFill) {\n let fillStyle: string | CanvasGradient = this.props.backgroundColor || 'transparent'\n if (this.props.gradient) {\n const { type = 'linear', colors, direction = 'to-bottom' } = this.props.gradient\n let grad: CanvasGradient | null = null\n if (colors && colors.length > 0 && width > 0 && height > 0) {\n if (type === 'linear') {\n let x0 = 0,\n y0 = 0,\n x1 = 0,\n y1 = 0\n let directionIsValid = false\n if (Array.isArray(direction) && direction.length === 4) {\n ;[x0, y0, x1, y1] = direction\n directionIsValid = true\n } else if (typeof direction === 'string') {\n switch (direction.toLowerCase()) {\n case 'to-right':\n x0 = 0\n y0 = 0\n x1 = width\n y1 = 0\n directionIsValid = true\n break\n case 'to-left':\n x0 = width\n y0 = 0\n x1 = 0\n y1 = 0\n directionIsValid = true\n break\n case 'to-bottom':\n x0 = 0\n y0 = 0\n x1 = 0\n y1 = height\n directionIsValid = true\n break\n case 'to-top':\n x0 = 0\n y0 = height\n x1 = 0\n y1 = 0\n directionIsValid = true\n break\n case 'to-top-right':\n x0 = 0\n y0 = height\n x1 = width\n y1 = 0\n directionIsValid = true\n break\n case 'to-top-left':\n x0 = width\n y0 = height\n x1 = 0\n y1 = 0\n directionIsValid = true\n break\n case 'to-bottom-right':\n x0 = 0\n y0 = 0\n x1 = width\n y1 = height\n directionIsValid = true\n break\n case 'to-bottom-left':\n x0 = width\n y0 = 0\n x1 = 0\n y1 = height\n directionIsValid = true\n break\n }\n }\n if (directionIsValid) {\n grad = ctx.createLinearGradient(x + x0, y + y0, x + x1, y + y1)\n } else {\n console.warn(`[BoxNode ${this.key}] Invalid linear gradient direction:`, direction)\n }\n } else if (type === 'radial') {\n const centerX = x + width / 2\n const centerY = y + height / 2\n const r0 = 0\n const r1 = 0.5 * Math.sqrt(width * width + height * height)\n if (r1 > 0) {\n grad = ctx.createRadialGradient(centerX, centerY, r0, centerX, centerY, r1)\n }\n }\n if (grad) {\n colors.forEach((color, i) => {\n const stop = colors.length > 1 ? Math.max(0, Math.min(1, i / (colors.length - 1))) : 0.5\n grad!.addColorStop(stop, color)\n })\n fillStyle = grad\n } else {\n console.warn(`[BoxNode ${this.key}] Could not create ${type} gradient. Falling back to backgroundColor.`)\n }\n } else {\n if (!colors?.length) {\n console.warn(`[BoxNode ${this.key}] Gradient specified but no colors provided. Falling back to backgroundColor.`)\n } else {\n console.warn(`[BoxNode ${this.key}] Cannot draw gradient with zero width/height.`)\n }\n }\n }\n if (fillStyle && fillStyle !== 'transparent') {\n ctx.fillStyle = fillStyle\n drawRoundedRectPath(ctx, x, y, width, height, radii)\n ctx.fill()\n }\n }\n\n // Render inset shadows\n // This logic uses standard context methods and remains unchanged.\n if (insetShadows.length > 0) {\n for (const shadow of insetShadows) {\n ctx.save()\n const color = shadow.color ?? 'black'\n const shadowOffsetX = shadow.offsetX ?? 0\n const shadowOffsetY = shadow.offsetY ?? 0\n const blur = shadow.blur ?? Math.max(shadowOffsetX, shadowOffsetY)\n drawRoundedRectPath(ctx, x, y, width, height, radii)\n ctx.clip()\n ctx.shadowColor = color\n ctx.shadowOffsetX = shadowOffsetX\n ctx.shadowOffsetY = shadowOffsetY\n ctx.shadowBlur = blur\n ctx.lineWidth = 1 // Minimal line width for the stroke.\n ctx.strokeStyle = 'transparent' // Stroke color doesn't matter; only the shadow does.\n // Draw a slightly offset path *inside* the clip to generate the inset shadow.\n drawRoundedRectPath(ctx, x - shadowOffsetX, y - shadowOffsetY, width, height, radii)\n ctx.stroke() // The stroke generates the shadow inside the clipped area.\n ctx.restore()\n }\n }\n\n // Render border strokes\n // (This logic uses standard context methods via drawBorders helper and remains unchanged)\n drawBorders({\n ctx,\n node: this.node,\n x,\n y,\n width,\n height,\n radii,\n borderColor: this.props.borderColor,\n borderStyle: this.props.borderStyle,\n })\n }\n}\n\n/**\n * Creates a new BoxNode instance.\n * @param {BoxProps} props Box properties and configuration.\n * @returns {BoxNode} New BoxNode instance.\n */\nexport const Box = (props: BoxProps): BoxNode => new BoxNode(props)\n\n/**\n * @class ColumnNode\n * Node class for vertical column layout\n */\nexport class ColumnNode extends BoxNode {\n constructor(props: BoxProps & BaseProps = {}) {\n super({\n display: Style.Display.Flex,\n flexDirection: Style.FlexDirection.Column,\n flexShrink: 1,\n flexBasis: props.flexGrow === 1 ? 0 : undefined,\n ...props,\n })\n }\n}\n\n/**\n * Creates a new ColumnNode instance.\n * @param {BoxProps} props Column properties and configuration.\n * @returns {ColumnNode} New ColumnNode instance.\n */\nexport const Column = (props: BoxProps): ColumnNode => new ColumnNode(props)\n\n/**\n * @class RowNode\n * @classdesc Node class for horizontal row layout.\n */\nexport class RowNode extends BoxNode {\n constructor(props: BoxProps & BaseProps = {}) {\n super({\n name: 'Row',\n display: Style.Display.Flex,\n flexDirection: Style.FlexDirection.Row,\n flexShrink: 1, // Default shrink for rows\n ...props,\n })\n }\n}\n\n/**\n * Creates a new RowNode instance.\n * @param {BoxProps} props Row properties and configuration.\n * @returns {RowNode} New RowNode instance.\n */\nexport const Row = (props: BoxProps): RowNode => new RowNode(props)\n"],"names":["Yoga","Style","omit","parsePercentage","parseBorderRadius","drawRoundedRectPath","Canvas","drawBorders"],"mappings":"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"}
|
|
@@ -13,11 +13,13 @@ export declare class RootNode extends ColumnNode {
|
|
|
13
13
|
private ctx;
|
|
14
14
|
/** Target width for the canvas in pixels */
|
|
15
15
|
private readonly targetWidth;
|
|
16
|
+
/** Target height for the canvas in pixels */
|
|
17
|
+
private readonly targetHeight;
|
|
16
18
|
/** Scale factor for rendering (e.g. 2 for 2x resolution) */
|
|
17
19
|
private readonly scale;
|
|
18
20
|
/**
|
|
19
21
|
* Creates a new root node for canvas rendering
|
|
20
|
-
* @param props
|
|
22
|
+
* @param props Configuration properties for the root node
|
|
21
23
|
* @throws Error if width property is not provided
|
|
22
24
|
*/
|
|
23
25
|
constructor(props: RootProps & BaseProps);
|
|
@@ -35,7 +37,7 @@ export declare class RootNode extends ColumnNode {
|
|
|
35
37
|
}
|
|
36
38
|
/**
|
|
37
39
|
* Creates and renders a new root node with the given properties
|
|
38
|
-
* @param props
|
|
40
|
+
* @param props Configuration properties for the root node
|
|
39
41
|
* @returns Promise resolving to the rendered Canvas instance
|
|
40
42
|
*/
|
|
41
43
|
export declare const Root: (props: RootProps) => Promise<Canvas>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.canvas.util.d.ts","sourceRoot":"","sources":["../../../src/canvas/root.canvas.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA8C,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,UAAU,EAAW,MAAM,gCAAgC,CAAA;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAUnE,eAAO,MAAM,qBAAqB,YAEjC,CAAA;AAED;;;GAGG;AACH,qBAAa,QAAS,SAAQ,UAAU;IACtC,6CAA6C;IAC7C,OAAO,CAAC,MAAM,CAAoB;IAClC,8CAA8C;IAC9C,OAAO,CAAC,GAAG,CAAwC;IACnD,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAE9B;;;;OAIG;gBACS,KAAK,EAAE,SAAS,GAAG,SAAS;
|
|
1
|
+
{"version":3,"file":"root.canvas.util.d.ts","sourceRoot":"","sources":["../../../src/canvas/root.canvas.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA8C,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,UAAU,EAAW,MAAM,gCAAgC,CAAA;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAUnE,eAAO,MAAM,qBAAqB,YAEjC,CAAA;AAED;;;GAGG;AACH,qBAAa,QAAS,SAAQ,UAAU;IACtC,6CAA6C;IAC7C,OAAO,CAAC,MAAM,CAAoB;IAClC,8CAA8C;IAC9C,OAAO,CAAC,GAAG,CAAwC;IACnD,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAE9B;;;;OAIG;gBACS,KAAK,EAAE,SAAS,GAAG,SAAS;IAyCxC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;CAqChC;AAED;;;;GAIG;AACH,eAAO,MAAM,IAAI,GAAU,OAAO,SAAS,oBAAuC,CAAA"}
|
|
@@ -40,16 +40,19 @@ class RootNode extends layout_canvas_util.ColumnNode {
|
|
|
40
40
|
ctx = null;
|
|
41
41
|
/** Target width for the canvas in pixels */
|
|
42
42
|
targetWidth;
|
|
43
|
+
/** Target height for the canvas in pixels */
|
|
44
|
+
targetHeight;
|
|
43
45
|
/** Scale factor for rendering (e.g. 2 for 2x resolution) */
|
|
44
46
|
scale;
|
|
45
47
|
/**
|
|
46
48
|
* Creates a new root node for canvas rendering
|
|
47
|
-
* @param props
|
|
49
|
+
* @param props Configuration properties for the root node
|
|
48
50
|
* @throws Error if width property is not provided
|
|
49
51
|
*/
|
|
50
52
|
constructor(props) {
|
|
51
53
|
// Call the parent constructor with root name and props
|
|
52
54
|
super({ name: 'Root', ...props });
|
|
55
|
+
this.props = props;
|
|
53
56
|
// Validate the required width property
|
|
54
57
|
if (!props.width) {
|
|
55
58
|
throw new Error('Width and height are required for Root');
|
|
@@ -73,6 +76,7 @@ class RootNode extends layout_canvas_util.ColumnNode {
|
|
|
73
76
|
// Set up scale and width
|
|
74
77
|
this.scale = props.scale || 1;
|
|
75
78
|
this.targetWidth = props.width;
|
|
79
|
+
this.targetHeight = props.height;
|
|
76
80
|
this.node.setWidth(this.targetWidth);
|
|
77
81
|
// Initialize children nodes
|
|
78
82
|
this.processInitialChildren();
|
|
@@ -115,7 +119,7 @@ class RootNode extends layout_canvas_util.ColumnNode {
|
|
|
115
119
|
// Step 4: Create a canvas with calculated dimensions
|
|
116
120
|
const calculatedContentHeight = this.node.getComputedHeight();
|
|
117
121
|
const finalCanvasWidth = Math.ceil(this.targetWidth * this.scale);
|
|
118
|
-
const finalCanvasHeight = Math.max(1, Math.ceil(calculatedContentHeight * this.scale));
|
|
122
|
+
const finalCanvasHeight = this.targetHeight ? Math.ceil(this.targetHeight * this.scale) : Math.max(1, Math.ceil(calculatedContentHeight * this.scale));
|
|
119
123
|
// Step 5: Set up canvas context
|
|
120
124
|
this.canvas = new skiaCanvas.Canvas(finalCanvasWidth, finalCanvasHeight);
|
|
121
125
|
this.ctx = this.canvas.getContext('2d');
|
|
@@ -130,7 +134,7 @@ class RootNode extends layout_canvas_util.ColumnNode {
|
|
|
130
134
|
}
|
|
131
135
|
/**
|
|
132
136
|
* Creates and renders a new root node with the given properties
|
|
133
|
-
* @param props
|
|
137
|
+
* @param props Configuration properties for the root node
|
|
134
138
|
* @returns Promise resolving to the rendered Canvas instance
|
|
135
139
|
*/
|
|
136
140
|
const Root = async (props) => await new RootNode(props).render();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.canvas.util.js","sources":["../../../../src/canvas/root.canvas.util.ts"],"sourcesContent":["import { Canvas, FontLibrary, type CanvasRenderingContext2D } from 'skia-canvas'\nimport { ColumnNode, BoxNode } from '@/canvas/layout.canvas.util.js'\nimport type { BaseProps, RootProps } from '@/canvas/canvas.type.js'\nimport { ImageNode } from '@/canvas/image.canvas.util.js'\nimport { Style } from '@/constant/common.const.js'\nimport * as path from 'node:path'\nimport * as fs from 'node:fs'\n\n/** Registry to track fonts that have already been loaded */\nconst registeredFonts = new Map<string, Set<string>>()\n\n// Exported for testing purposes only\nexport const _clearRegisteredFonts = () => {\n registeredFonts.clear()\n}\n\n/**\n * Root node that manages the canvas rendering context and coordinates overall layout and drawing.\n * Inherits from ColumnNode to provide vertical layout capabilities.\n */\nexport class RootNode extends ColumnNode {\n /** The canvas instance used for rendering */\n private canvas: Canvas | undefined\n /** The 2D rendering context for the canvas */\n private ctx: CanvasRenderingContext2D | null = null\n /** Target width for the canvas in pixels */\n private readonly targetWidth: number\n /** Scale factor for rendering (e.g. 2 for 2x resolution) */\n private readonly scale: number\n\n /**\n * Creates a new root node for canvas rendering\n * @param props
|
|
1
|
+
{"version":3,"file":"root.canvas.util.js","sources":["../../../../src/canvas/root.canvas.util.ts"],"sourcesContent":["import { Canvas, FontLibrary, type CanvasRenderingContext2D } from 'skia-canvas'\nimport { ColumnNode, BoxNode } from '@/canvas/layout.canvas.util.js'\nimport type { BaseProps, RootProps } from '@/canvas/canvas.type.js'\nimport { ImageNode } from '@/canvas/image.canvas.util.js'\nimport { Style } from '@/constant/common.const.js'\nimport * as path from 'node:path'\nimport * as fs from 'node:fs'\n\n/** Registry to track fonts that have already been loaded */\nconst registeredFonts = new Map<string, Set<string>>()\n\n// Exported for testing purposes only\nexport const _clearRegisteredFonts = () => {\n registeredFonts.clear()\n}\n\n/**\n * Root node that manages the canvas rendering context and coordinates overall layout and drawing.\n * Inherits from ColumnNode to provide vertical layout capabilities.\n */\nexport class RootNode extends ColumnNode {\n /** The canvas instance used for rendering */\n private canvas: Canvas | undefined\n /** The 2D rendering context for the canvas */\n private ctx: CanvasRenderingContext2D | null = null\n /** Target width for the canvas in pixels */\n private readonly targetWidth: number\n /** Target height for the canvas in pixels */\n private readonly targetHeight: number\n /** Scale factor for rendering (e.g. 2 for 2x resolution) */\n private readonly scale: number\n\n /**\n * Creates a new root node for canvas rendering\n * @param props Configuration properties for the root node\n * @throws Error if width property is not provided\n */\n constructor(props: RootProps & BaseProps) {\n // Call the parent constructor with root name and props\n super({ name: 'Root', ...props })\n\n this.props = props\n\n // Validate the required width property\n if (!props.width) {\n throw new Error('Width and height are required for Root')\n }\n\n // Register provided fonts with caching\n if (props.fonts?.length) {\n for (const font of props.fonts) {\n const family = font.family\n const paths = font.paths.map(p => path.resolve(p))\n\n if (!registeredFonts.has(family)) {\n registeredFonts.set(family, new Set())\n }\n\n const cachedPaths = registeredFonts.get(family)!\n const newPaths = paths.filter(p => !cachedPaths.has(p) && fs.existsSync(p))\n\n if (newPaths.length > 0) {\n FontLibrary.use({ [family]: newPaths })\n newPaths.forEach(p => cachedPaths.add(p))\n }\n }\n }\n\n // Set up scale and width\n this.scale = props.scale || 1\n this.targetWidth = props.width\n this.targetHeight = props.height\n this.node.setWidth(this.targetWidth)\n\n // Initialize children nodes\n this.processInitialChildren()\n }\n\n /**\n * Traverses the node tree to find all ImageNode instances using breadth-first search\n * @returns Array of all ImageNode instances found in the tree\n */\n private findAllImageNodes(): ImageNode[] {\n const imageNodes: ImageNode[] = []\n const queue: BoxNode[] = [this]\n while (queue.length > 0) {\n const node = queue.shift()!\n if (node instanceof ImageNode) {\n imageNodes.push(node)\n }\n queue.push(...node.children)\n }\n return imageNodes\n }\n\n /**\n * Renders the entire node tree to a canvas, handling image loading, layout calculation,\n * and final drawing\n * @returns Promise resolving to the rendered Canvas instance\n */\n async render(): Promise<Canvas> {\n // Step 1: Load all images\n const imageNodes = this.findAllImageNodes()\n const loadingPromises = imageNodes.map(node => node.getLoadingPromise())\n\n if (loadingPromises.length > 0) {\n await Promise.allSettled(loadingPromises)\n }\n\n // Step 2: Calculate initial layout\n this.node.calculateLayout(this.targetWidth, undefined, Style.Direction.LTR)\n\n // Step 3: Allow nodes to finalize their layout\n const needRecalculate = this.finalizeLayout()\n if (needRecalculate) {\n this.node.calculateLayout(this.targetWidth, undefined, Style.Direction.LTR)\n }\n\n // Step 4: Create a canvas with calculated dimensions\n const calculatedContentHeight = this.node.getComputedHeight()\n const finalCanvasWidth = Math.ceil(this.targetWidth * this.scale)\n const finalCanvasHeight = this.targetHeight ? Math.ceil(this.targetHeight * this.scale) : Math.max(1, Math.ceil(calculatedContentHeight * this.scale))\n\n // Step 5: Set up canvas context\n this.canvas = new Canvas(finalCanvasWidth, finalCanvasHeight)\n this.ctx = this.canvas.getContext('2d')\n this.ctx.scale(this.scale, this.scale)\n\n // Step 6: Render content\n super.render(this.ctx, 0, 0)\n\n if (!this.canvas) {\n throw new Error('Canvas not initialized')\n }\n\n return this.canvas\n }\n}\n\n/**\n * Creates and renders a new root node with the given properties\n * @param props Configuration properties for the root node\n * @returns Promise resolving to the rendered Canvas instance\n */\nexport const Root = async (props: RootProps) => await new RootNode(props).render()\n"],"names":["ColumnNode","path","fs","FontLibrary","ImageNode","Style","Canvas"],"mappings":"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"}
|
|
@@ -33,8 +33,7 @@ export declare class TextNode extends BoxNode {
|
|
|
33
33
|
* - \b - Backspace (removed)
|
|
34
34
|
* - \f - Form feed (treated as newline)
|
|
35
35
|
* - \v - Vertical tab (treated as newline)
|
|
36
|
-
*
|
|
37
|
-
* @param input - Raw text string potentially containing escape sequences
|
|
36
|
+
* @param input Raw text string potentially containing escape sequences
|
|
38
37
|
* @returns Processed string with escape sequences converted
|
|
39
38
|
*/
|
|
40
39
|
private processEscapeSequences;
|
|
@@ -52,9 +51,8 @@ export declare class TextNode extends BoxNode {
|
|
|
52
51
|
* <color="red">, <color='red'>, <color=red>
|
|
53
52
|
*
|
|
54
53
|
* Tags can be nested and must be properly closed with </tag>
|
|
55
|
-
*
|
|
56
|
-
* @param
|
|
57
|
-
* @param baseStyle - Default style properties to apply to all segments
|
|
54
|
+
* @param input Text string containing markup tags
|
|
55
|
+
* @param baseStyle Default style properties to apply to all segments
|
|
58
56
|
* @returns Array of styled text segments with consistent style properties
|
|
59
57
|
*/
|
|
60
58
|
private parseRichText;
|
|
@@ -69,8 +67,7 @@ export declare class TextNode extends BoxNode {
|
|
|
69
67
|
* - Style: segment <i> > base fontStyle
|
|
70
68
|
* - Size: segment size > base fontSize
|
|
71
69
|
* - Family: base fontFamily
|
|
72
|
-
*
|
|
73
|
-
* @param segmentStyle - Optional TextSegment styling to override base props
|
|
70
|
+
* @param segmentStyle Optional TextSegment styling to override base props
|
|
74
71
|
* @returns Formatted CSS font string for canvas context
|
|
75
72
|
*/
|
|
76
73
|
private getFontString;
|
|
@@ -87,33 +84,30 @@ export declare class TextNode extends BoxNode {
|
|
|
87
84
|
* 2. Otherwise calculating dynamic height based on largest font size per line
|
|
88
85
|
* 3. Adding leading space above/below text content
|
|
89
86
|
* 4. Including specified line gaps between lines
|
|
90
|
-
*
|
|
91
|
-
* @param
|
|
92
|
-
* @param widthMode - YogaLayout mode determining how width constraint is applied
|
|
87
|
+
* @param widthConstraint Maximum allowed width in pixels for text layout
|
|
88
|
+
* @param widthMode YogaLayout mode determining how width constraint is applied
|
|
93
89
|
* @returns Calculated minimum dimensions required to render text content
|
|
94
|
-
*
|
|
95
|
-
*
|
|
90
|
+
* - width: Total width needed for text layout
|
|
91
|
+
* - height: Total height including line heights and gaps
|
|
96
92
|
*/
|
|
97
93
|
private measureText;
|
|
98
94
|
/**
|
|
99
95
|
* Wraps text segments into multiple lines while respecting width constraints and preserving styling.
|
|
100
96
|
* Handles rich text attributes (color, weight, size, bold, italic) and proper word wrapping.
|
|
101
97
|
* Also respects explicit newline characters (\n) for forced line breaks.
|
|
102
|
-
*
|
|
103
|
-
* @param
|
|
104
|
-
* @param
|
|
105
|
-
* @param
|
|
106
|
-
* @param parsedWordSpacingPx - Additional spacing to add between words in pixels
|
|
98
|
+
* @param ctx Canvas rendering context used for text measurements
|
|
99
|
+
* @param segments Array of text segments with styling information
|
|
100
|
+
* @param maxWidth Maximum allowed width for each line in pixels
|
|
101
|
+
* @param parsedWordSpacingPx Additional spacing to add between words in pixels
|
|
107
102
|
* @returns Array of lines, where each line contains styled text segments
|
|
108
103
|
*/
|
|
109
104
|
private wrapTextRich;
|
|
110
105
|
/**
|
|
111
106
|
* Breaks a word segment into multiple segments that each fit within the specified width constraint.
|
|
112
107
|
* Maintains all styling properties (color, weight, size, bold, italic) across broken segments.
|
|
113
|
-
*
|
|
114
|
-
* @param
|
|
115
|
-
* @param
|
|
116
|
-
* @param maxWidth - Maximum width allowed for each resulting segment
|
|
108
|
+
* @param ctx Canvas rendering context used for text measurements
|
|
109
|
+
* @param segmentToBreak Original text segment to split
|
|
110
|
+
* @param maxWidth Maximum width allowed for each resulting segment
|
|
117
111
|
* @returns Array of TextSegments, each fitting maxWidth, or original segment if no breaking needed
|
|
118
112
|
*/
|
|
119
113
|
private breakWordRich;
|
|
@@ -132,12 +126,11 @@ export declare class TextNode extends BoxNode {
|
|
|
132
126
|
* - Ellipsis truncation
|
|
133
127
|
* - Rich text styling per segment (color, weight, size, etc)
|
|
134
128
|
* - Performance optimizations (clipping, visibility checks)
|
|
135
|
-
*
|
|
136
|
-
* @param
|
|
137
|
-
* @param
|
|
138
|
-
* @param
|
|
139
|
-
* @param
|
|
140
|
-
* @param height - Content box total height including padding
|
|
129
|
+
* @param ctx Canvas rendering context
|
|
130
|
+
* @param x Content box left position in pixels
|
|
131
|
+
* @param y Content box top position in pixels
|
|
132
|
+
* @param width Content box total width including padding
|
|
133
|
+
* @param height Content box total height including padding
|
|
141
134
|
*/
|
|
142
135
|
protected _renderContent(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number): void;
|
|
143
136
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.canvas.util.d.ts","sourceRoot":"","sources":["../../../src/canvas/text.canvas.util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text.canvas.util.d.ts","sourceRoot":"","sources":["../../../src/canvas/text.canvas.util.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAU,KAAK,wBAAwB,EAA2B,MAAM,aAAa,CAAA;AAC5F,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAGxD;;;GAGG;AACH,qBAAa,QAAS,SAAQ,OAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAwC;IACzE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IACxC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,kBAAkB,CAAe;IAEjC,KAAK,EAAE,SAAS,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;gBAElC,IAAI,GAAE,MAAM,GAAG,MAAW,EAAE,KAAK,GAAE,SAAc;cAuB1C,aAAa,IAAI,IAAI;IAoDxC;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,sBAAsB;IA8B9B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,aAAa;IA+ErB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,gBAAgB;IAyBxB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,aAAa;IAiCrB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,WAAW;IA8NnB;;;;;;;;;OASG;IACH,OAAO,CAAC,YAAY;IAuKpB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAmErB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;;;;;;;;;;OAgBG;cACgB,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CA8UrH;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,GAAG,MAAM,EAAE,QAAQ,SAAS,aAA8B,CAAA"}
|