Conversation
…e in Context.ts - Add bilingual (Japanese + English) @description to all class methods - Add @param and @return tags to all methods with parameters - Add JSDoc comments to all class properties - Add English translations to module-level constant JSDoc - Convert camelCase method parameters to snake_case: - viewportWidth/viewportHeight -> viewport_width/viewport_height - vertexBuffer -> vertex_buffer, vertexCount -> vertex_count - bindGroup -> bind_group, uniformOffset -> uniform_offset - useStencilPipeline -> use_stencil_pipeline - flipY -> flip_y - Internal method body variables left unchanged per convention Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove Matrix.release(rawData) on persistent cacheAsBitmap Matrix (rawData returns internal Float32Array; releasing it corrupts the Matrix on subsequent frames, causing cache key mismatch every frame) - Signal render mode via render queue: 0=vector, 1=bitmap, 2=cacheAsBitmap - Add bitmap-like drawing path for cacheAsBitmap in Shape/TextField renderers (setTransform with matrix/cacheScale compensation for correct screen size) - Revert rotation path to original (cacheAsBitmap uses its own drawing path) - Encode cacheAsBitmap flag in TextField changed field using bit flags Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…X/scaleY Cache quality = cacheMatrix.scale × ownScale × stage.rendererScale - Matrix(1,0,0,1) at scaleX=1 → 1x quality (base) - Matrix(1,0,0,1) at scaleX=3 → 3x quality (matches own scale) - Matrix(2,0,0,2) at scaleX=1 → 2x quality (double) - Parent scale changes → cache reused (ownScale unchanged) - Hit tests, width, height remain vector-based (no change needed) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR introduces cacheAsBitmap support (Matrix-based bitmap caching) and updates rendering/hit-testing/bounds logic to respect the cache transform, along with broader refactors to WebGPU/WebGL utilities and test suites.
Changes:
- Add
DisplayObject.cacheAsBitmap(Matrix) and propagate cache-scale into render queues, renderer paths, hit tests, and bounds calculations. - Refactor several WebGPU utility modules (doc improvements, parameter renames, pre-allocation reuse) and remove multiple legacy services/shader helpers.
- Update and add unit/e2e tests (notably for new stencil services, cache removal, cacheAsBitmap e2e coverage), while removing a large number of prior tests.
Reviewed changes
Copilot reviewed 166 out of 274 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/webgpu/src/Mesh/service/MeshLerpService.test.ts | Removes MeshLerpService unit tests |
| packages/webgpu/src/Mesh/service/MeshFillGenerateService.ts | Improves JSDoc param descriptions |
| packages/webgpu/src/Mask/usecase/MaskBindUseCase.ts | Removes MaskBindUseCase implementation |
| packages/webgpu/src/Mask/usecase/MaskBindUseCase.test.ts | Removes MaskBindUseCase unit tests |
| packages/webgpu/src/Mask.ts | Expands docs; removes mask attachment stack; adds/reset clarifications |
| packages/webgpu/src/Mask.test.ts | Removes tests for deleted mask attachment stack |
| packages/webgpu/src/Gradient/GradientLUTCache.ts | Adds documentation and LUT cache TTL docs |
| packages/webgpu/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.ts | Renames params; doc updates |
| packages/webgpu/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.ts | Renames params; doc updates; id counter rename |
| packages/webgpu/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.ts | Removes pending-release flush service |
| packages/webgpu/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.test.ts | Removes pending-release flush service tests |
| packages/webgpu/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.ts | Refactors signature; adds pre-allocation docs |
| packages/webgpu/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.ts | Refactors signature; adds pre-allocation docs |
| packages/webgpu/src/FrameBufferManager.test.ts | Removes resizeAttachment test coverage |
| packages/webgpu/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.ts | Uses shared DEG_TO_RAD; renames params; cache-as-bitmap compatible transform branch |
| packages/webgpu/src/Filter/GlowFilterShader.ts | Removes GlowFilterShader class |
| packages/webgpu/src/Filter/GlowFilterShader.test.ts | Removes GlowFilterShader tests |
| packages/webgpu/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.ts | Uses shared color util; renames params |
| packages/webgpu/src/Filter/FilterUtil.ts | Adds shared filter utilities (DEG_TO_RAD and color conversions) |
| packages/webgpu/src/Filter/FilterGradientLUTCache.ts | Adds device reference documentation |
| packages/webgpu/src/Filter/DropShadowFilterShader.ts | Removes DropShadowFilterShader class |
| packages/webgpu/src/Filter/DropShadowFilterShader.test.ts | Removes DropShadowFilterShader tests |
| packages/webgpu/src/Filter/DisplacementMapFilterShader.ts | Removes displacement shader generator |
| packages/webgpu/src/Filter/ConvolutionFilterShader.ts | Removes convolution shader generator |
| packages/webgpu/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.ts | Uses shared straight RGBA util; renames params |
| packages/webgpu/src/Filter/ColorMatrixFilterShader.ts | Removes ColorMatrixFilterShader class |
| packages/webgpu/src/Filter/ColorMatrixFilterShader.test.ts | Removes ColorMatrixFilterShader tests |
| packages/webgpu/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.ts | Renames params to snake_case in docs/signature |
| packages/webgpu/src/Filter/BlurFilterUseCase.ts | Refactors constants and param naming; doc expansion |
| packages/webgpu/src/Filter/BlurFilterShader.ts | Removes BlurFilterShader class |
| packages/webgpu/src/Filter/BlurFilterShader.test.ts | Removes BlurFilterShader tests |
| packages/webgpu/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.ts | Removes compute blur helper service |
| packages/webgpu/src/Filter/BitmapFilterShader.test.ts | Removes bitmap filter shader tests |
| packages/webgpu/src/Filter/BevelFilterShader.ts | Removes bevel shader generator |
| packages/webgpu/src/Filter/BevelFilterShader.test.ts | Removes bevel shader generator tests |
| packages/webgpu/src/Context/usecase/ContextGradientStrokeUseCase.ts | Adds preallocation/docs for gradient stroke path |
| packages/webgpu/src/Context/usecase/ContextGradientFillUseCase.ts | Adds preallocation/docs for gradient fill + stencil caches |
| packages/webgpu/src/Context/usecase/ContextDrawArraysInstancedUseCase.ts | Extracts pipeline-name selection helper; adds docs |
| packages/webgpu/src/Context/usecase/ContextClipUseCase.ts | Adds uniform preallocation docs |
| packages/webgpu/src/Context/usecase/ContextBitmapStrokeUseCase.ts | Adds sampler cache + docs |
| packages/webgpu/src/Context/usecase/ContextBitmapFillUseCase.ts | Adds sampler cache + stencil caches + docs |
| packages/webgpu/src/Context/service/ContextFillWithStencilService.ts | Adds service docs |
| packages/webgpu/src/Context/service/ContextFillWithStencilMainService.ts | Adds service docs |
| packages/webgpu/src/Context/service/ContextFillWithStencilMainService.test.ts | Adds tests for main-canvas stencil/fill two-pass service |
| packages/webgpu/src/Context/service/ContextFillSimpleService.ts | Adds service docs |
| packages/webgpu/src/Context/service/ContextComputeGradientMatrixService.ts | Renames params; adds docs |
| packages/webgpu/src/Context/service/ContextComputeBitmapMatrixService.ts | Adds docs for bitmap inverse-matrix computation |
| packages/webgpu/src/Context.test.ts | Updates buffer manager mocked method (acquireVertexBuffer) and removes clearRect test |
| packages/webgpu/src/Compute/service/ComputeExecuteBlurService.ts | Removes compute blur executor |
| packages/webgpu/src/Compute/ComputePipelineManager.test.ts | Removes compute pipeline manager tests |
| packages/webgpu/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.ts | Removes storage buffer release usecase |
| packages/webgpu/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.ts | Adds missing @return in docs |
| packages/webgpu/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.test.ts | Adds unit tests for storage buffer cleanup |
| packages/webgpu/src/BufferManager/usecase/BufferManagerAcquireStorageBufferUseCase.test.ts | Inlines release helper; removes release usecase tests |
| packages/webgpu/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.ts | Adds missing @return in docs |
| packages/webgpu/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.test.ts | Adds unit tests for indirect buffer updates |
| packages/webgpu/src/BufferManager/service/BufferManagerReleaseVertexBufferService.ts | Renames constant; keeps bucket-cap logic |
| packages/webgpu/src/BufferManager/service/BufferManagerReleaseUniformBufferService.ts | Renames constant; keeps bucket-cap logic |
| packages/webgpu/src/Blend/usecase/BlendOperationUseCase.ts | Removes blend operation usecase |
| packages/webgpu/src/Blend/usecase/BlendOperationUseCase.test.ts | Removes blend operation tests |
| packages/webgpu/src/Blend/usecase/BlendApplyComplexBlendUseCase.ts | Renames params; doc expansion; error log uses renamed param |
| packages/webgpu/src/Blend/service/BlendSetModeService.ts | Removes blend mode setter service |
| packages/webgpu/src/Blend/service/BlendSetModeService.test.ts | Removes blend mode setter tests |
| packages/webgpu/src/Blend/service/BlendScreenService.ts | Removes screen blend service |
| packages/webgpu/src/Blend/service/BlendScreenService.test.ts | Removes screen blend service tests |
| packages/webgpu/src/Blend/service/BlendResetService.ts | Removes reset blend service |
| packages/webgpu/src/Blend/service/BlendResetService.test.ts | Removes reset blend service tests |
| packages/webgpu/src/Blend/service/BlendOneZeroService.ts | Removes one-zero blend service |
| packages/webgpu/src/Blend/service/BlendOneZeroService.test.ts | Removes one-zero blend service tests |
| packages/webgpu/src/Blend/service/BlendGetStateService.ts | Removes blend-state getter service wrapper |
| packages/webgpu/src/Blend/service/BlendGetStateService.test.ts | Removes blend-state getter tests |
| packages/webgpu/src/Blend/service/BlendEraseService.ts | Removes erase blend service |
| packages/webgpu/src/Blend/service/BlendEraseService.test.ts | Removes erase blend service tests |
| packages/webgpu/src/Blend/service/BlendAlphaService.ts | Removes alpha blend service |
| packages/webgpu/src/Blend/service/BlendAlphaService.test.ts | Removes alpha blend service tests |
| packages/webgpu/src/Blend/service/BlendAddService.ts | Removes add blend service |
| packages/webgpu/src/Blend/service/BlendAddService.test.ts | Removes add blend service tests |
| packages/webgpu/src/Blend/BlendInstancedManager.ts | Renames internal consts; expands docs; minor refactor |
| packages/webgpu/src/Blend.ts | Removes funcCode state; documents blendMode and blend-state function |
| packages/webgpu/src/Blend.test.ts | Removes tests for deleted funcCode API |
| packages/webgpu/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.ts | Renames param; adds internal function docs; removes adaptive-threshold helper |
| packages/webgpu/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.test.ts | Removes tests for deleted adaptive-threshold helper |
| packages/webgpu/src/BezierConverter/BezierConverter.ts | Adjusts exports/docs after threshold helper removal |
| packages/webgpu/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.ts | Renames pool params; doc updates |
| packages/webgpu/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.ts | Renames pool/id params; doc updates |
| packages/webgpu/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.ts | Renames params; doc updates |
| packages/webgpu/src/AttachmentManager/service/AttachmentManagerGetTextureService.ts | Renames params; doc updates |
| packages/webgpu/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.ts | Renames params; doc updates |
| packages/webgpu/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.ts | Renames params; doc updates |
| packages/webgpu/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.ts | Renames id counter param; doc updates |
| packages/webgpu/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.ts | Renames id counter param; doc updates |
| packages/webgpu/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.ts | Removes render pass descriptor factory service |
| packages/webgpu/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.ts | Doc updates |
| packages/webgpu/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.ts | Renames id counter param; doc updates |
| packages/webgpu/src/AttachmentManager.ts | Removes currentAttachment binding API and descriptor creator; adds docs |
| packages/webgpu/src/AttachmentManager.test.ts | Removes tests for removed binding/descriptor methods |
| packages/webgpu/src/AtlasManager.test.ts | Removes tests for removed atlas helpers; updates assertions |
| packages/webgl/src/Context/usecase/ContextContainerDrawCachedFilterUseCase.test.ts | Adds tests for cached filter draw behavior |
| packages/webgl/src/Context/usecase/ContextContainerBeginLayerUseCase.test.ts | Adds tests for container layer stack behavior |
| packages/text/src/interface/IHtmlNode.ts | Adds HTML node union types for parser output |
| packages/text/src/TextParser/usecase/TextParserParseTagUseCase.test.ts | Switches parseTag input to string (removes htmlparser2 usage) |
| packages/text/src/TextParser/usecase/TextParserParseHtmlTextUseCase.ts | Removes htmlparser2 parsing; passes raw HTML to parseTag |
| packages/text/package.json | Removes htmlparser2 dependency |
| packages/renderer/src/TextField/usecase/TextFieldRenderUseCase.ts | Adds cacheAsBitmap flag handling and transform path |
| packages/renderer/src/Shape/usecase/ShapeRenderUseCase.ts | Adds renderMode (vector/bitmap/cacheAsBitmap) handling |
| packages/renderer/src/Shape/usecase/ShapeRenderUseCase.test.ts | Adds unit tests for shape render paths (not cacheAsBitmap) |
| packages/renderer/src/Shape/usecase/ShapeClipRenderUseCase.test.ts | Adds unit tests for clip render usecase |
| packages/renderer/src/DisplayObjectContainer/usecase/DisplayObjectContainerClipRenderUseCase.test.ts | Adds unit tests for clip traversal |
| packages/renderer/src/Command/service/CommandRemoveCacheService.test.ts | Adds unit tests for cache removal command |
| packages/media/src/Video/usecase/VideoBuildFromCharacterUseCase.test.ts | Adds unit tests for video build behavior |
| packages/media/src/Sound/service/SoundDecodeService.test.ts | Adds unit tests for sound decode behavior |
| packages/display/src/TextField/usecase/TextFieldHitTestUseCase.ts | Applies cacheAsBitmap scaling in hit tests |
| packages/display/src/TextField/usecase/TextFieldCalcBoundsMatrixUseCase.ts | Applies cacheAsBitmap scaling in bounds calculations |
| packages/display/src/Shape/usecase/ShapeHitTestUseCase.ts | Applies cacheAsBitmap scaling in hit tests |
| packages/display/src/Shape/usecase/ShapeGenerateRenderQueueUseCase.ts | Pushes cacheAsBitmap render mode; scales matrix + caching params |
| packages/display/src/Shape/usecase/ShapeCalcBoundsMatrixUseCase.ts | Applies cacheAsBitmap scaling in bounds calculations |
| packages/display/src/Loader/usecase/LoaderLoadJsonUseCase.ts | Adds error handling for unzip worker |
| packages/display/src/DisplayObject/usecase/DisplayObjectHitTestPointUseCase.ts | Applies cacheAsBitmap scaling to hit test matrix |
| packages/display/src/DisplayObject.ts | Adds cacheAsBitmap API and changes scaleX/scaleY behavior |
| packages/display/src/DisplayObject.test.ts | Adds unit tests for cacheAsBitmap API behavior |
| package.json | Bumps version; updates devDependencies; removes root dependencies block |
| e2e/tests/textfield.spec.ts | Adds e2e coverage for htmlText and cacheAsBitmap |
| e2e/tests/shape.spec.ts | Adds e2e coverage for cacheAsBitmap |
| e2e/pages/mask/sprite-mask.html | Stabilizes video masking e2e by waiting for complete/seeked |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| { | ||
| "name": "@next2d/player", | ||
| "version": "3.0.5", | ||
| "version": "3.1.0", |
There was a problem hiding this comment.
The PR title ('added cacheAsBitmap') doesn’t reflect the scope of changes (large-scale removals/refactors across WebGPU Blend/Compute/Shader utilities, dependency removal, and many test deletions). Please update the PR title/description to match the broader refactor, or split unrelated cleanups into separate PRs to keep reviewability and risk manageable.
| get scaleX (): number | ||
| { | ||
| return this.$scaleX === null | ||
| const base = this.$scaleX === null | ||
| ? displayObjectGetScaleXUseCase(this) | ||
| : this.$scaleX; | ||
|
|
||
| if (this._$cacheAsBitmap) { | ||
| const m = this._$cacheAsBitmap.rawData; | ||
| return base * Math.sqrt(m[0] * m[0] + m[1] * m[1]); | ||
| } | ||
| return base; | ||
| } |
There was a problem hiding this comment.
The scaleX/scaleY getters now implicitly incorporate cacheAsBitmap scale. This changes the public meaning of scaleX/scaleY from 'transform scale' to 'transform × cache scale', which can break existing callers (layout, physics, input handling) that expect scale to reflect only the object’s transform. Prefer keeping scaleX/scaleY as the true transform scale and applying cache scaling only within rendering/bounds/hit-test paths (as you already do elsewhere), or expose a separate derived getter (e.g. renderScaleX/renderScaleY) if needed.
| let rawMatrix = displayObjectGetRawMatrixUseCase(shape); | ||
|
|
||
| // cacheAsBitmap倍率をrawMatrixに適用 | ||
| const cacheMatrix = shape.cacheAsBitmap; | ||
| let scaledMatrix: Float32Array | null = null; | ||
| if (cacheMatrix) { | ||
| const m = cacheMatrix.rawData; | ||
| const csx = Math.sqrt(m[0] * m[0] + m[1] * m[1]); | ||
| const csy = Math.sqrt(m[2] * m[2] + m[3] * m[3]); | ||
| if (rawMatrix) { | ||
| scaledMatrix = $getFloat32Array6( | ||
| rawMatrix[0] * csx, rawMatrix[1] * csx, | ||
| rawMatrix[2] * csy, rawMatrix[3] * csy, | ||
| rawMatrix[4], rawMatrix[5] | ||
| ); | ||
| } else { | ||
| scaledMatrix = $getFloat32Array6(csx, 0, 0, csy, 0, 0); | ||
| } | ||
| rawMatrix = scaledMatrix; | ||
| } |
There was a problem hiding this comment.
The same cacheAsBitmap matrix-scaling block is duplicated across multiple hit-test and bounds usecases (Shape/TextField/DisplayObject). Consider extracting a shared helper (e.g. in DisplayObjectUtil) that takes (rawMatrix, cacheAsBitmapMatrix) and returns a pooled scaled matrix (plus a small wrapper to ensure pooling is always handled). This will reduce copy/paste divergence and make future changes (e.g. handling rotation/shear in cache matrix) safer.
| // text state (bit 0 = changed, bit 1 = cacheAsBitmap) | ||
| const changedFlag = render_queue[index++]; |
There was a problem hiding this comment.
render_queue is a Float32Array, but this logic relies on bitwise ops (which coerce to 32-bit integers). To make the encoding contract explicit and robust, consider coercing once (e.g. const changedFlag = render_queue[index++] | 0;) and/or documenting that this slot must always be an integer (0..3). This avoids surprising behavior if a non-integer ever lands here.
| // text state (bit 0 = changed, bit 1 = cacheAsBitmap) | |
| const changedFlag = render_queue[index++]; | |
| // text state flag stored as integer bitmask in Float32Array (bit 0 = changed, bit 1 = cacheAsBitmap) | |
| const changedFlag = render_queue[index++] | 0; |
| const renderMode = render_queue[index++]; // 0=vector, 1=bitmap, 2=cacheAsBitmap | ||
| const isBitmap = renderMode === 1; | ||
| const isCacheAsBitmap = renderMode === 2; |
There was a problem hiding this comment.
The new renderMode === 2 (cacheAsBitmap) flow introduces a distinct transform path, but the added unit tests for ShapeRenderUseCase only cover vector/filtered cases and don’t exercise the cacheAsBitmap branch. Please add a unit test that sets renderMode to 2 and asserts the expected setTransform parameters (and any other side effects unique to this mode).
| if (isCacheAsBitmap) { | ||
|
|
||
| const tx = xMin * xScale; | ||
| const ty = yMin * yScale; | ||
|
|
||
| const cosX = Math.cos(radianX); | ||
| const sinX = Math.sin(radianX); | ||
| const cosY = Math.cos(radianY); | ||
| const sinY = Math.sin(radianY); | ||
| // cacheAsBitmap: Bitmapと同様の描画パスで、cacheScaleを補正 | ||
| // baseBounds原点(xMin,yMin)のスクリーン座標をtranslationに反映 | ||
| const screenX = matrix[0] * xMin + matrix[2] * yMin + matrix[4]; | ||
| const screenY = matrix[1] * xMin + matrix[3] * yMin + matrix[5]; | ||
|
|
||
| $context.setTransform( | ||
| cosX, sinX, -sinY, cosY, | ||
| tx * cosX - ty * sinY + matrix[4], | ||
| tx * sinX + ty * cosY + matrix[5] | ||
| matrix[0] / xScale, matrix[1] / xScale, | ||
| matrix[2] / yScale, matrix[3] / yScale, | ||
| screenX, screenY | ||
| ); | ||
|
|
||
| } else { |
There was a problem hiding this comment.
The TextFieldRenderUseCase now has a dedicated cacheAsBitmap transform branch that changes setTransform behavior, but there’s no corresponding unit test to validate it. Please add a unit test that encodes the flag (bit 1) and verifies setTransform is called with the expected scaled components and translation derived from (xMin, yMin).
| await new Promise<void>((resolve, reject): void => | ||
| { | ||
| $unzipWorker.onmessage = (event: MessageEvent): void => | ||
| { | ||
| if (event.data && event.data.error) { | ||
| reject(new Error(event.data.error)); | ||
| return; | ||
| } | ||
| loaderBuildService(loader, event.data as IAnimationToolData); | ||
| resolve(); | ||
| }; | ||
|
|
||
| $unzipWorker.onerror = (event: ErrorEvent): void => | ||
| { | ||
| reject(new Error(event.message)); | ||
| }; |
There was a problem hiding this comment.
Because $unzipWorker.onmessage/onerror are assigned per call, concurrent LoaderLoadJsonUseCase executions can overwrite handlers and resolve/reject the wrong promise (or leak handlers). If parallel loads are possible, prefer addEventListener with { once: true } (or explicit cleanup/reset of handlers in finally) and consider correlating responses with request IDs.
No description provided.