UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

1 lines 18.6 kB
{"version":3,"file":"CanvasStencilMaskPipe.mjs","sources":["../../../../src/rendering/mask/stencil/CanvasStencilMaskPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { type Matrix } from '../../../maths/matrix/Matrix';\nimport { Graphics } from '../../../scene/graphics/shared/Graphics';\nimport { warn } from '../../../utils/logging/warn';\n\nimport type { ShapePrimitive } from '../../../maths/shapes/ShapePrimitive';\nimport type { Container } from '../../../scene/container/Container';\nimport type { Effect } from '../../../scene/container/Effect';\nimport type { ShapePrimitiveWithHoles } from '../../../scene/graphics/shared/path/ShapePath';\nimport type { CrossPlatformCanvasRenderingContext2D } from '../../renderers/canvas/CanvasContextSystem';\nimport type { InstructionSet } from '../../renderers/shared/instructions/InstructionSet';\nimport type { InstructionPipe } from '../../renderers/shared/instructions/RenderPipe';\nimport type { Renderer } from '../../renderers/types';\nimport type { StencilMaskInstruction } from './StencilMaskTypes';\n\nfunction buildRoundedRectPath(\n context: CrossPlatformCanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number\n): void\n{\n radius = Math.max(0, Math.min(radius, Math.min(width, height) / 2));\n\n context.moveTo(x + radius, y);\n context.lineTo(x + width - radius, y);\n context.quadraticCurveTo(x + width, y, x + width, y + radius);\n context.lineTo(x + width, y + height - radius);\n context.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n context.lineTo(x + radius, y + height);\n context.quadraticCurveTo(x, y + height, x, y + height - radius);\n context.lineTo(x, y + radius);\n context.quadraticCurveTo(x, y, x + radius, y);\n}\n\nfunction buildShapePath(context: CrossPlatformCanvasRenderingContext2D, shape: ShapePrimitive): void\n{\n switch (shape.type)\n {\n case 'rectangle':\n {\n const rect = shape as typeof shape & { width: number; height: number };\n\n context.rect(rect.x, rect.y, rect.width, rect.height);\n break;\n }\n case 'roundedRectangle':\n {\n const rect = shape as typeof shape & { width: number; height: number; radius: number };\n\n buildRoundedRectPath(context, rect.x, rect.y, rect.width, rect.height, rect.radius);\n break;\n }\n case 'circle':\n {\n const circle = shape as typeof shape & { radius: number };\n\n context.moveTo(circle.x + circle.radius, circle.y);\n context.arc(circle.x, circle.y, circle.radius, 0, Math.PI * 2);\n break;\n }\n case 'ellipse':\n {\n const ellipse = shape as typeof shape & { halfWidth: number; halfHeight: number };\n\n if (context.ellipse)\n {\n context.moveTo(ellipse.x + ellipse.halfWidth, ellipse.y);\n context.ellipse(ellipse.x, ellipse.y, ellipse.halfWidth, ellipse.halfHeight, 0, 0, Math.PI * 2);\n }\n else\n {\n context.save();\n context.translate(ellipse.x, ellipse.y);\n context.scale(ellipse.halfWidth, ellipse.halfHeight);\n context.moveTo(1, 0);\n context.arc(0, 0, 1, 0, Math.PI * 2);\n context.restore();\n }\n break;\n }\n case 'triangle':\n {\n const tri = shape as typeof shape & { x2: number; y2: number; x3: number; y3: number };\n\n context.moveTo(tri.x, tri.y);\n context.lineTo(tri.x2, tri.y2);\n context.lineTo(tri.x3, tri.y3);\n context.closePath();\n break;\n }\n case 'polygon':\n default:\n {\n const poly = shape as typeof shape & { points: number[]; closePath: boolean };\n const points = poly.points;\n\n if (!points?.length) break;\n\n context.moveTo(points[0], points[1]);\n\n for (let i = 2; i < points.length; i += 2)\n {\n context.lineTo(points[i], points[i + 1]);\n }\n\n if (poly.closePath)\n {\n context.closePath();\n }\n break;\n }\n }\n}\n\nfunction addHolePaths(\n context: CrossPlatformCanvasRenderingContext2D,\n holes?: ShapePrimitiveWithHoles[]\n): boolean\n{\n if (!holes?.length) return false;\n\n for (let i = 0; i < holes.length; i++)\n {\n const hole = holes[i];\n\n if (!hole?.shape) continue;\n\n const transform = hole.transform;\n const hasTransform = transform && !transform.isIdentity();\n\n if (hasTransform)\n {\n context.save();\n context.transform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty);\n }\n\n buildShapePath(context, hole.shape);\n\n if (hasTransform)\n {\n context.restore();\n }\n }\n\n return true;\n}\n\n/** @internal */\nexport class CanvasStencilMaskPipe implements InstructionPipe<StencilMaskInstruction>\n{\n public static extension = {\n type: [\n ExtensionType.CanvasPipes,\n ],\n name: 'stencilMask',\n } as const;\n\n private _renderer: Renderer;\n private _warnedMaskTypes = new Set<string>();\n private _canvasMaskStack: boolean[] = [];\n\n constructor(renderer: Renderer)\n {\n this._renderer = renderer;\n }\n\n public push(mask: Effect, _container: Container, instructionSet: InstructionSet): void\n {\n this._renderer.renderPipes.batch.break(instructionSet);\n\n instructionSet.add({\n renderPipeId: 'stencilMask',\n action: 'pushMaskBegin',\n mask,\n inverse: _container._maskOptions.inverse,\n canBundle: false,\n } as StencilMaskInstruction);\n }\n\n public pop(_mask: Effect, _container: Container, instructionSet: InstructionSet): void\n {\n this._renderer.renderPipes.batch.break(instructionSet);\n\n instructionSet.add({\n renderPipeId: 'stencilMask',\n action: 'popMaskEnd',\n mask: _mask,\n inverse: _container._maskOptions.inverse,\n canBundle: false,\n } as StencilMaskInstruction);\n }\n\n public execute(instruction: StencilMaskInstruction)\n {\n if (instruction.action !== 'pushMaskBegin' && instruction.action !== 'popMaskEnd')\n {\n return;\n }\n\n const canvasRenderer = this._renderer as unknown as {\n canvasContext: {\n activeContext: CrossPlatformCanvasRenderingContext2D;\n setContextTransform: (transform: Matrix, roundPixels?: boolean) => void;\n };\n _roundPixels: number;\n };\n const contextSystem = canvasRenderer.canvasContext;\n const context = contextSystem?.activeContext;\n\n if (!context) return;\n\n if (instruction.action === 'popMaskEnd')\n {\n const didClip = this._canvasMaskStack.pop();\n\n if (didClip)\n {\n context.restore();\n }\n\n return;\n }\n\n if (instruction.inverse)\n {\n this._warnOnce(\n 'inverse',\n 'CanvasRenderer: inverse masks are not supported on Canvas2D; '\n + 'ignoring inverse flag.'\n );\n }\n\n const maskContainer = instruction.mask.mask;\n\n if (!(maskContainer instanceof Graphics))\n {\n this._warnOnce(\n 'nonGraphics',\n 'CanvasRenderer: only Graphics masks are supported in Canvas2D; '\n + 'skipping mask.'\n );\n this._canvasMaskStack.push(false);\n\n return;\n }\n\n const graphics = maskContainer;\n const instructions = graphics.context?.instructions;\n\n if (!instructions?.length)\n {\n this._canvasMaskStack.push(false);\n\n return;\n }\n\n context.save();\n contextSystem.setContextTransform(\n graphics.groupTransform,\n ((canvasRenderer._roundPixels | graphics._roundPixels) as 0 | 1) === 1\n );\n context.beginPath();\n\n let drewPath = false;\n let hasHoles = false;\n\n for (let i = 0; i < instructions.length; i++)\n {\n const instructionData = instructions[i];\n const action = instructionData.action;\n\n if (action !== 'fill' && action !== 'stroke') continue;\n\n const data = instructionData.data as {\n path?: {\n shapePath?: {\n shapePrimitives?: ShapePrimitiveWithHoles[];\n };\n };\n };\n const shapePath = data?.path?.shapePath;\n\n if (!shapePath?.shapePrimitives?.length) continue;\n\n const shapePrimitives = shapePath.shapePrimitives;\n\n for (let j = 0; j < shapePrimitives.length; j++)\n {\n const primitive = shapePrimitives[j];\n\n if (!primitive?.shape) continue;\n\n const transform = primitive.transform;\n const hasTransform = transform && !transform.isIdentity();\n\n if (hasTransform)\n {\n context.save();\n context.transform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty);\n }\n\n buildShapePath(context, primitive.shape as ShapePrimitive);\n hasHoles = addHolePaths(context, primitive.holes) || hasHoles;\n drewPath = true;\n\n if (hasTransform)\n {\n context.restore();\n }\n }\n }\n\n if (!drewPath)\n {\n context.restore();\n this._canvasMaskStack.push(false);\n\n return;\n }\n\n if (hasHoles)\n {\n context.clip('evenodd');\n }\n else\n {\n context.clip();\n }\n\n this._canvasMaskStack.push(true);\n }\n\n public destroy()\n {\n this._renderer = null;\n this._warnedMaskTypes = null;\n this._canvasMaskStack = null;\n }\n\n private _warnOnce(key: string, message: string): void\n {\n if (this._warnedMaskTypes.has(key)) return;\n\n this._warnedMaskTypes.add(key);\n warn(message);\n }\n}\n"],"names":[],"mappings":"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"}