From 4fd2fa168bb91ca626a2be29f5de9547822e3fc4 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Fri, 24 Oct 2025 11:17:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B0=86=E8=B4=B4=E5=9B=BE=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=E5=9B=BE=E9=9B=86=E7=9A=84=E4=B8=80=E9=83=A8?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/render-assets/src/texture.ts | 32 ++++++++++++++++++++++++++- packages/render-assets/src/types.ts | 10 +++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/render-assets/src/texture.ts b/packages/render-assets/src/texture.ts index b92c12d..27848f4 100644 --- a/packages/render-assets/src/texture.ts +++ b/packages/render-assets/src/texture.ts @@ -3,6 +3,7 @@ import { IRect, ITexture, ITextureAnimater, + ITextureComposedData, ITextureRenderable, ITextureSplitter, SizedCanvasImageSource @@ -13,6 +14,7 @@ export class Texture implements ITexture { animater: ITextureAnimater | null = null; width: number; height: number; + isBitmap: boolean = false; /** 裁剪矩形的左边框位置 */ private cl: number; @@ -59,7 +61,18 @@ export class Texture implements ITexture { async toBitmap(): Promise { if (this.source instanceof ImageBitmap) return; - this.source = await createImageBitmap(this.source); + this.source = await createImageBitmap( + this.source, + this.cl, + this.ct, + this.width, + this.height + ); + this.cl = 0; + this.ct = 0; + this.cr = this.width; + this.cb = this.height; + this.isBitmap = true; } split(splitter: ITextureSplitter, data: U): Generator { @@ -110,6 +123,23 @@ export class Texture implements ITexture { this.animater = null; } + toAsset(asset: ITextureComposedData): boolean { + const rect = asset.assetMap.get(this); + if (!rect) return false; + if (this.isBitmap && this.source instanceof ImageBitmap) { + this.source.close(); + } + this.isBitmap = false; + this.source = asset.texture.source; + this.cl = rect.x; + this.ct = rect.y; + this.width = rect.w; + this.height = rect.h; + this.cr = rect.x + rect.w; + this.cb = rect.y + rect.h; + return true; + } + /** * 对贴图的动画执行偏移效果。动画效果可以不来自传入的贴图对象, * 输出结果的图像源会是传入的贴图对象的图像源而非动画效果对应的图像源 diff --git a/packages/render-assets/src/types.ts b/packages/render-assets/src/types.ts index 8ed01f2..773e1d4 100644 --- a/packages/render-assets/src/types.ts +++ b/packages/render-assets/src/types.ts @@ -98,6 +98,9 @@ export interface ITexture { /** 贴图高度 */ readonly height: number; + /** 当前贴图是否是完整 bitmap 图像 */ + readonly isBitmap: boolean; + /** * 将此贴图转换为 bitmap 图像,图像源也会转变成 ImageBitmap */ @@ -151,6 +154,13 @@ export interface ITexture { * 释放此贴图的资源,将不能再被使用 */ dispose(): void; + + /** + * 将贴图的图像源转换为指定图集的图像源,并将范围限定至图集中对应到此贴图的矩形范围。 + * @param asset 图集信息 + * @returns 是否转换成功,如果图集信息中不包含当前贴图,那么返回 `false` + */ + toAsset(asset: ITextureComposedData): boolean; } export interface ITextureStore {