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 • 16.6 kB
Source Map (JSON)
{"version":3,"file":"CanvasBatchAdaptor.mjs","sources":["../../../../src/rendering/batcher/canvas/CanvasBatchAdaptor.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { groupD8 } from '../../../maths/matrix/groupD8';\nimport { Matrix } from '../../../maths/matrix/Matrix';\nimport { bgr2rgb } from '../../../scene/container/container-mixins/getGlobalMixin';\nimport { multiplyHexColors } from '../../../scene/container/utils/multiplyHexColors';\nimport { type PatternRepetition } from '../../../scene/graphics/shared/fill/FillPattern';\nimport { canvasUtils } from '../../renderers/canvas/utils/canvasUtils';\n\nimport type { CanvasRenderer } from '../../renderers/canvas/CanvasRenderer';\nimport type { Geometry } from '../../renderers/shared/geometry/Geometry';\nimport type { Shader } from '../../renderers/shared/shader/Shader';\nimport type { Batch } from '../shared/Batcher';\nimport type { BatcherAdaptor, BatcherPipe } from '../shared/BatcherPipe';\nimport type { DefaultBatchableQuadElement } from '../shared/DefaultBatcher';\n\n/**\n * A BatcherAdaptor that renders batches using Canvas2D.\n * @category rendering\n * @ignore\n */\nexport class CanvasBatchAdaptor implements BatcherAdaptor\n{\n private static readonly _tempPatternMatrix = new Matrix();\n\n private static _getPatternRepeat(\n addressModeU?: string,\n addressModeV?: string\n ): PatternRepetition\n {\n const repeatU = addressModeU && addressModeU !== 'clamp-to-edge';\n const repeatV = addressModeV && addressModeV !== 'clamp-to-edge';\n\n if (repeatU && repeatV) return 'repeat';\n if (repeatU) return 'repeat-x';\n if (repeatV) return 'repeat-y';\n\n return 'no-repeat';\n }\n\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.CanvasPipesAdaptor,\n ],\n name: 'batch',\n } as const;\n\n public start(batchPipe: BatcherPipe, geometry: Geometry, shader: Shader): void\n {\n void batchPipe;\n void geometry;\n void shader;\n }\n\n public execute(batchPipe: BatcherPipe, batch: Batch): void\n {\n const elements = batch.elements;\n\n if (!elements || !elements.length) return;\n\n const renderer = batchPipe.renderer as CanvasRenderer;\n const contextSystem = renderer.canvasContext;\n const context = contextSystem.activeContext;\n\n for (let i = 0; i < elements.length; i++)\n {\n const element = elements[i];\n\n if (!element.packAsQuad) continue;\n\n const quad = element as DefaultBatchableQuadElement;\n const texture = quad.texture;\n const source = texture ? canvasUtils.getCanvasSource(texture) : null;\n\n if (!source) continue;\n\n const textureStyle = texture.source.style;\n const smoothProperty = contextSystem.smoothProperty;\n const shouldSmooth = textureStyle.scaleMode !== 'nearest';\n\n if (context[smoothProperty] !== shouldSmooth)\n {\n context[smoothProperty] = shouldSmooth;\n }\n\n // Use the batch-level (already alpha-adjusted) blend mode\n contextSystem.setBlendMode(batch.blendMode);\n\n const globalColor = renderer.globalUniforms.globalUniformData?.worldColor ?? 0xFFFFFFFF;\n const argb = quad.color;\n\n const globalAlpha = ((globalColor >>> 24) & 0xFF) / 255;\n const quadAlpha = ((argb >>> 24) & 0xFF) / 255;\n\n const filterAlpha = (renderer.filter as { alphaMultiplier?: number } | null)?.alphaMultiplier ?? 1;\n const alpha = globalAlpha * quadAlpha * filterAlpha;\n\n if (alpha <= 0) continue;\n\n context.globalAlpha = alpha;\n\n const globalTint = globalColor & 0xFFFFFF;\n const quadTint = argb & 0xFFFFFF;\n\n const tint = bgr2rgb(multiplyHexColors(quadTint, globalTint));\n const frame = texture.frame;\n const repeatU = textureStyle.addressModeU ?? textureStyle.addressMode;\n const repeatV = textureStyle.addressModeV ?? textureStyle.addressMode;\n const repeat = CanvasBatchAdaptor._getPatternRepeat(repeatU, repeatV);\n\n const resolution = texture.source._resolution ?? texture.source.resolution ?? 1;\n\n const isFromCachedRenderGroup = ((quad as any).renderable as any)?.renderGroup?.isCachedAsTexture;\n\n const sx = frame.x * resolution;\n const sy = frame.y * resolution;\n const sw = frame.width * resolution;\n const sh = frame.height * resolution;\n\n const bounds = quad.bounds;\n\n const isRootTarget = renderer.renderTarget.renderTarget.isRoot;\n const dx = bounds.minX;\n const dy = bounds.minY;\n const dw = bounds.maxX - bounds.minX;\n const dh = bounds.maxY - bounds.minY;\n\n const rotate = texture.rotate;\n\n const uvs = texture.uvs;\n const uvMin = Math.min(uvs.x0, uvs.x1, uvs.x2, uvs.x3, uvs.y0, uvs.y1, uvs.y2, uvs.y3);\n const uvMax = Math.max(uvs.x0, uvs.x1, uvs.x2, uvs.x3, uvs.y0, uvs.y1, uvs.y2, uvs.y3);\n const needsRepeat = repeat !== 'no-repeat' && (uvMin < 0 || uvMax > 1);\n\n // Determine if we'll use getTintedCanvas (which handles rotation internally)\n // Use it for tinting OR rotation (for non-repeat path)\n const willUseProcessedCanvas = !needsRepeat && (tint !== 0xFFFFFF || rotate);\n // Only apply rotation transform when NOT using processed canvas (which handles rotation itself)\n const applyRotateTransform = rotate && !willUseProcessedCanvas;\n\n if (applyRotateTransform)\n {\n CanvasBatchAdaptor._tempPatternMatrix.copyFrom(quad.transform);\n groupD8.matrixAppendRotationInv(\n CanvasBatchAdaptor._tempPatternMatrix,\n rotate,\n dx,\n dy,\n dw,\n dh\n );\n contextSystem.setContextTransform(\n CanvasBatchAdaptor._tempPatternMatrix,\n quad.roundPixels === 1,\n undefined,\n isFromCachedRenderGroup && isRootTarget\n );\n }\n else\n {\n contextSystem.setContextTransform(\n quad.transform,\n quad.roundPixels === 1,\n undefined,\n isFromCachedRenderGroup && isRootTarget\n );\n }\n\n const drawX = applyRotateTransform ? 0 : dx;\n const drawY = applyRotateTransform ? 0 : dy;\n const drawW = dw;\n const drawH = dh;\n\n if (needsRepeat)\n {\n // We can now allow tinting for PMA textures because getCanvasSource\n // returns an un-premultiplied (straight alpha) version for Canvas.\n // NOTE: Don't use getTintedCanvas when rotated because it applies rotation compensation,\n // but the repeat path uses UV-based pattern transforms that expect the original rotated source.\n let patternSource = source;\n\n const canTint = tint !== 0xFFFFFF && !rotate;\n const fitsFrame = frame.width <= texture.source.width && frame.height <= texture.source.height;\n\n if (canTint && fitsFrame)\n {\n patternSource = canvasUtils.getTintedCanvas({ texture }, tint) as CanvasImageSource;\n }\n\n const pattern = context.createPattern(patternSource, repeat);\n\n if (!pattern) continue;\n\n const denomX = drawW;\n const denomY = drawH;\n\n if (denomX === 0 || denomY === 0) continue;\n\n const invDx = 1 / denomX;\n const invDy = 1 / denomY;\n\n const a = (uvs.x1 - uvs.x0) * invDx;\n const b = (uvs.y1 - uvs.y0) * invDx;\n const c = (uvs.x3 - uvs.x0) * invDy;\n const d = (uvs.y3 - uvs.y0) * invDy;\n const tx = uvs.x0 - (a * drawX) - (c * drawY);\n const ty = uvs.y0 - (b * drawX) - (d * drawY);\n\n const pixelWidth = texture.source.pixelWidth;\n const pixelHeight = texture.source.pixelHeight;\n\n CanvasBatchAdaptor._tempPatternMatrix.set(\n a * pixelWidth,\n b * pixelHeight,\n c * pixelWidth,\n d * pixelHeight,\n tx * pixelWidth,\n ty * pixelHeight\n );\n\n canvasUtils.applyPatternTransform(pattern, CanvasBatchAdaptor._tempPatternMatrix);\n context.fillStyle = pattern;\n context.fillRect(drawX, drawY, drawW, drawH);\n }\n else\n {\n // We can now allow tinting for PMA textures because getCanvasSource\n // returns an un-premultiplied (straight alpha) version for Canvas.\n // getTintedCanvas handles rotation internally, so use it for rotated textures too\n const needsProcessing = tint !== 0xFFFFFF || rotate;\n const processedSource = needsProcessing\n ? canvasUtils.getTintedCanvas({ texture }, tint) as CanvasImageSource\n : source;\n\n const isProcessed = processedSource !== source;\n\n context.drawImage(\n processedSource,\n isProcessed ? 0 : sx,\n isProcessed ? 0 : sy,\n isProcessed ? (processedSource as any).width : sw,\n isProcessed ? (processedSource as any).height : sh,\n drawX,\n drawY,\n drawW,\n drawH\n );\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}