From 0057632ba19e240dc7b9acdfc3549257252acf77 Mon Sep 17 00:00:00 2001 From: ienaga Date: Sun, 10 Aug 2025 10:54:21 +0900 Subject: [PATCH 1/8] #203 update packages --- package-lock.json | 66 +++++++++++++++++++++++------------------------ package.json | 10 +++---- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index c7533d88..4c590d3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@next2d/player", - "version": "2.4.2", + "version": "2.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@next2d/player", - "version": "2.4.2", + "version": "2.5.0", "license": "MIT", "workspaces": [ "packages/*" @@ -17,23 +17,23 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.32.0", + "@eslint/js": "^9.33.0", "@rollup/plugin-commonjs": "^28.0.6", "@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", - "@types/node": "^24.2.0", + "@types/node": "^24.2.1", "@typescript-eslint/eslint-plugin": "^8.39.0", "@typescript-eslint/parser": "^8.39.0", "@vitest/web-worker": "^3.2.4", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "eslint-plugin-unused-imports": "^4.1.4", "globals": "^16.3.0", "jsdom": "^26.1.0", "rollup": "^4.46.2", "tslib": "^2.8.1", "typescript": "^5.9.2", - "vite": "^7.0.6", + "vite": "^7.1.1", "vitest": "^3.2.4", "vitest-webgl-canvas-mock": "^1.1.0" }, @@ -674,9 +674,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -684,9 +684,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -734,9 +734,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", - "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", + "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", "dev": true, "license": "MIT", "engines": { @@ -757,13 +757,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -1417,9 +1417,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz", - "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", + "version": "24.2.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.1.tgz", + "integrity": "sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2315,20 +2315,20 @@ } }, "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", + "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", + "@eslint/js": "9.33.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -3945,9 +3945,9 @@ } }, "node_modules/vite": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", - "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.1.tgz", + "integrity": "sha512-yJ+Mp7OyV+4S+afWo+QyoL9jFWD11QFH0i5i7JypnfTcA1rmgxCbiA8WwAICDEtZ1Z1hzrVhN8R8rGTqkTY8ZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3955,7 +3955,7 @@ "fdir": "^6.4.6", "picomatch": "^4.0.3", "postcss": "^8.5.6", - "rollup": "^4.40.0", + "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "bin": { diff --git a/package.json b/package.json index 4df496f5..fda22fd4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@next2d/player", - "version": "2.4.2", + "version": "2.5.0", "description": "Experience the fast and beautiful anti-aliased rendering of WebGL. You can create rich, interactive graphics, cross-platform applications and games without worrying about browser or device compatibility.", "author": "Toshiyuki Ienaga (https://github.com/ienaga/)", "license": "MIT", @@ -46,23 +46,23 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.32.0", + "@eslint/js": "^9.33.0", "@rollup/plugin-commonjs": "^28.0.6", "@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.4", - "@types/node": "^24.2.0", + "@types/node": "^24.2.1", "@typescript-eslint/eslint-plugin": "^8.39.0", "@typescript-eslint/parser": "^8.39.0", "@vitest/web-worker": "^3.2.4", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "eslint-plugin-unused-imports": "^4.1.4", "globals": "^16.3.0", "jsdom": "^26.1.0", "rollup": "^4.46.2", "tslib": "^2.8.1", "typescript": "^5.9.2", - "vite": "^7.0.6", + "vite": "^7.1.1", "vitest": "^3.2.4", "vitest-webgl-canvas-mock": "^1.1.0" }, From 94c71db88532336635d534b90617bb9f3b313dba Mon Sep 17 00:00:00 2001 From: ienaga Date: Sun, 10 Aug 2025 10:54:42 +0900 Subject: [PATCH 2/8] =?UTF-8?q?#203=20=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E6=83=85=E5=A0=B1=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 26511782..209ea82b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import { Next2D } from "@next2d/core"; if (!("next2d" in window)) { - console.log("%c Next2D Player %c 2.4.1 %c https://next2d.app", + console.log("%c Next2D Player %c 2.5.0 %c https://next2d.app", "color: #fff; background: #5f5f5f", "color: #fff; background: #4bc729", ""); From 614c79a633462243cd2dca90c1cd682692740a45 Mon Sep 17 00:00:00 2001 From: ienaga Date: Sun, 10 Aug 2025 11:12:11 +0900 Subject: [PATCH 3/8] =?UTF-8?q?#203=20=E5=9B=9E=E8=BB=A2=E6=99=82=E3=81=AE?= =?UTF-8?q?x=E3=82=B9=E3=82=B1=E3=83=BC=E3=83=AB=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AE=E3=83=90=E3=82=B0=E6=94=B9=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DisplayObjectSetScaleXUseCase.test.ts | 30 +++++++++++++++++++ .../usecase/DisplayObjectSetScaleXUseCase.ts | 22 +++++++++----- .../DisplayObjectSetWidthUseCase.test.ts | 2 +- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.test.ts index d52c3fdf..86c58ceb 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.test.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.test.ts @@ -73,4 +73,34 @@ describe("DisplayObjectSetScaleXUseCase.js test", () => expect(displayObject.changed).toBe(true); expect(displayObject.$scaleX).toBe(1); }); + + it("execute test case1", () => + { + const displayObject = new DisplayObject(); + displayObject.changed = false; + + expect(displayObject.changed).toBe(false); + expect(displayObject.$scaleX).toBe(null); + expect(displayObject.$matrix).toBe(null); + + displayObject.rotation = 289; + execute(displayObject, -1.5); + + expect(displayObject.changed).toBe(true); + expect(displayObject.$scaleX).toBe(-1.5); + + execute(displayObject, 0.67); + + const rawData = displayObject.$matrix?.rawData; + if (!rawData) { + throw new Error("rawData is null"); + } + + expect(rawData[0]).toBe(0.2181306779384613); + expect(rawData[1]).toBe(-0.633497416973114); + expect(rawData[2]).toBe(0.9455185532569885); + expect(rawData[3]).toBe(0.32556816935539246); + expect(rawData[4]).toBe(0); + expect(rawData[5]).toBe(0); + }); }); \ No newline at end of file diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts index ff38859a..14fb2eb0 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts @@ -33,18 +33,26 @@ export const execute = (display_object: D, scale_x: num if (matrix.b === 0 || isNaN(matrix.b)) { - matrix.a = scale_x; + matrix.a = scaleX; } else { + const EPS = 1e-12; + const theta = Math.atan2(matrix.b, matrix.a); - let radianX = Math.atan2(matrix.b, matrix.a); - if (radianX === -Math.PI) { - radianX = 0; - } + // 現在の「符号付き scaleX」を推定(a が 0 近傍なら b で判定) + const sxAbs = Math.hypot(matrix.a, matrix.b); + const signX = (Math.abs(matrix.a) >= EPS ? Math.sign(matrix.a) : Math.sign(matrix.b)) || 1; + const sxSigned = sxAbs * signX; - matrix.b = scale_x * Math.sin(radianX); - matrix.a = scale_x * Math.cos(radianX); + // 角度正規化:scaleX を「非負」で表せる角度に直す(符号は角度から外す) + const thetaPos = sxSigned >= 0 ? theta : theta - Math.PI; + // ターゲットの符号を角度に載せる + const thetaUse = thetaPos + (scaleX < 0 ? Math.PI : 0); + + const use = Math.abs(scaleX); + matrix.a = use * Math.cos(thetaUse); + matrix.b = use * Math.sin(thetaUse); } display_object.$scaleX = scaleX; diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetWidthUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetWidthUseCase.test.ts index 0e9702ae..ec0a9343 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetWidthUseCase.test.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetWidthUseCase.test.ts @@ -91,7 +91,7 @@ describe("DisplayObjectSetWidthUseCase.js test", () => throw new Error("rawData is null"); } - expect(rawData[0]).toBe(0.4545454680919647); + expect(rawData[0]).toBe(0.4544999897480011); expect(rawData[1]).toBe(0); expect(rawData[2]).toBe(0); expect(rawData[3]).toBe(1); From 81b29971132cc9712e766d5f33091e7f3b287a80 Mon Sep 17 00:00:00 2001 From: ienaga Date: Sun, 10 Aug 2025 11:25:40 +0900 Subject: [PATCH 4/8] =?UTF-8?q?#203=20x=E3=82=B9=E3=82=B1=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E5=8F=96=E5=BE=97=E5=87=A6=E7=90=86=E6=99=82?= =?UTF-8?q?=E3=81=AE=E6=AD=A3=E8=B2=A0=E3=81=AE=E5=88=A4=E6=96=AD=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E6=94=B9=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/DisplayObjectGetScaleXUseCase.test.ts | 11 +++++++++++ .../usecase/DisplayObjectGetScaleXUseCase.ts | 9 ++++----- .../usecase/DisplayObjectSetScaleXUseCase.ts | 8 ++------ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.test.ts index 72e0bcc2..1251c7c9 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.test.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.test.ts @@ -34,4 +34,15 @@ describe("DisplayObjectGetScaleXUseCase.js test", () => }; expect(execute(displayObject)).toBe(1); }); + + it("execute test case4", () => + { + const displayObject = new DisplayObject(); + displayObject.rotation = 286; + displayObject.scaleX = -1.17; + expect(execute(displayObject)).toBe(-1.17); + + displayObject.scaleX = 0.65; + expect(execute(displayObject)).toBe(0.65); + }); }); \ No newline at end of file diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.ts index c1716c34..e004b8c1 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.ts @@ -20,10 +20,9 @@ export const execute = (display_object: D): number => return 1; } - const xScale = Math.round(Math.sqrt( - matrix[0] * matrix[0] - + matrix[1] * matrix[1] - ) * 10000) / 10000; + const EPS = 1e-12; + const signX = (Math.abs(matrix[0]) >= EPS ? Math.sign(matrix[0]) : Math.sign(matrix[1])) || 1; + const xScale = Math.round(Math.hypot(matrix[0], matrix[1]) * 10000) / 10000; - return 0 > matrix[0] ? xScale * -1 : xScale; + return xScale * signX; }; \ No newline at end of file diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts index 14fb2eb0..a4c376f7 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts @@ -36,18 +36,14 @@ export const execute = (display_object: D, scale_x: num matrix.a = scaleX; } else { - const EPS = 1e-12; + const EPS = 1e-12; const theta = Math.atan2(matrix.b, matrix.a); - // 現在の「符号付き scaleX」を推定(a が 0 近傍なら b で判定) const sxAbs = Math.hypot(matrix.a, matrix.b); const signX = (Math.abs(matrix.a) >= EPS ? Math.sign(matrix.a) : Math.sign(matrix.b)) || 1; + const sxSigned = sxAbs * signX; - - // 角度正規化:scaleX を「非負」で表せる角度に直す(符号は角度から外す) const thetaPos = sxSigned >= 0 ? theta : theta - Math.PI; - - // ターゲットの符号を角度に載せる const thetaUse = thetaPos + (scaleX < 0 ? Math.PI : 0); const use = Math.abs(scaleX); From 367ae351bded571d60fa281561d0f805df644ec7 Mon Sep 17 00:00:00 2001 From: ienaga Date: Sun, 10 Aug 2025 20:08:37 +0900 Subject: [PATCH 5/8] =?UTF-8?q?#203=20=E5=9B=9E=E8=BB=A2=E6=99=82=E3=81=AE?= =?UTF-8?q?y=E3=82=B9=E3=82=B1=E3=83=BC=E3=83=AB=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AE=E3=83=90=E3=82=B0=E6=94=B9=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/DisplayObjectGetScaleXUseCase.ts | 4 +-- .../DisplayObjectGetScaleYUseCase.test.ts | 25 +++++++++++++++++++ .../usecase/DisplayObjectGetScaleYUseCase.ts | 9 +++---- .../DisplayObjectSetHeightUseCase.test.ts | 2 +- .../usecase/DisplayObjectSetScaleYUseCase.ts | 23 ++++++++++++----- 5 files changed, 49 insertions(+), 14 deletions(-) diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.ts index e004b8c1..f7435008 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleXUseCase.ts @@ -22,7 +22,7 @@ export const execute = (display_object: D): number => const EPS = 1e-12; const signX = (Math.abs(matrix[0]) >= EPS ? Math.sign(matrix[0]) : Math.sign(matrix[1])) || 1; - const xScale = Math.round(Math.hypot(matrix[0], matrix[1]) * 10000) / 10000; + const xScale = Math.hypot(matrix[0], matrix[1]); - return xScale * signX; + return Math.round(xScale * signX * 10000) / 10000; }; \ No newline at end of file diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.test.ts index beb75325..4bb13f26 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.test.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.test.ts @@ -34,4 +34,29 @@ describe("DisplayObjectGetScaleYUseCase.js test", () => }; expect(execute(displayObject)).toBe(1); }); + + it("execute test case4", () => + { + const displayObject = new DisplayObject(); + displayObject.rotation = 190; + displayObject.scaleY = -1.56; + expect(execute(displayObject)).toBe(-1.56); + displayObject.scaleY = 0.56; + + const matrix = displayObject.$matrix; + if (!matrix) { + throw new Error("Matrix is not defined"); + } + + const rawData = matrix.rawData; + expect(rawData[0]).toBe(-0.9848077297210693); + expect(rawData[1]).toBe(-0.1736481785774231); + expect(rawData[2]).toBe(-0.09724298119544983); + expect(rawData[3]).toBe(0.5514923334121704); + expect(rawData[4]).toBe(0); + expect(rawData[5]).toBe(0); + + expect(execute(displayObject)).toBe(0.56); + + }); }); \ No newline at end of file diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.ts index de74a264..59044e52 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.ts @@ -20,10 +20,9 @@ export const execute = (display_object: D): number => return 1; } - const yScale = Math.round(Math.sqrt( - matrix[2] * matrix[2] - + matrix[3] * matrix[3] - ) * 10000) / 10000; + const EPS = 1e-12; - return 0 > matrix[3] ? yScale * -1 : yScale; + const sxAbs = Math.hypot(matrix[0], matrix[1]) + const signX = (Math.abs(matrix[0]) >= EPS ? Math.sign(matrix[0]) : Math.sign(matrix[1])) || 1; + return Math.round((matrix[0] * matrix[3] - matrix[1] * matrix[2]) / (sxAbs * signX) * 10000) / 10000; }; \ No newline at end of file diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetHeightUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetHeightUseCase.test.ts index 473d2f1a..078ae7ec 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetHeightUseCase.test.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetHeightUseCase.test.ts @@ -94,7 +94,7 @@ describe("DisplayObjectSetHeightUseCase.js test", () => expect(rawData[0]).toBe(1); expect(rawData[1]).toBe(0); expect(rawData[2]).toBe(0); - expect(rawData[3]).toBe(0.3333333432674408); + expect(rawData[3]).toBe(0.33329999446868896); expect(rawData[4]).toBe(0); expect(rawData[5]).toBe(0); }); diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.ts index 90659939..3580a333 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.ts @@ -33,17 +33,28 @@ export const execute = (display_object: D, scale_y: num if (matrix.c === 0 || isNaN(matrix.c)) { - matrix.d = scale_y; + matrix.d = scaleY; } else { - let radianY = Math.atan2(-matrix.c, matrix.d); - if (radianY === -Math.PI) { - radianY = 0; + const targetAbs = Math.max(0, Math.abs(scaleY)); + + const EPS = 1e-12; + let theta = Math.atan2(matrix.b, matrix.a); + if (matrix.a < 0 || Math.abs(matrix.a) < EPS && matrix.b < 0) { + theta -= Math.PI; + } + if (theta <= -Math.PI) { + theta += 2 * Math.PI; } - matrix.c = -scale_y * Math.sin(radianY); - matrix.d = scale_y * Math.cos(radianY); + if (theta > Math.PI) { + theta -= 2 * Math.PI; + } + + const thetaUse = theta + (scaleY < 0 ? Math.PI : 0); + matrix.c = -targetAbs * Math.sin(thetaUse); + matrix.d = targetAbs * Math.cos(thetaUse); } display_object.$scaleY = scaleY; From 70276d1d97ee98f3004cfbd38cdb91d8ece218a1 Mon Sep 17 00:00:00 2001 From: ienaga Date: Sun, 10 Aug 2025 20:14:59 +0900 Subject: [PATCH 6/8] =?UTF-8?q?#203=20Lint=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DisplayObject/usecase/DisplayObjectGetScaleYUseCase.ts | 2 +- .../DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts | 2 +- .../usecase/TextFieldGenerateRenderQueueUseCase.ts | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.ts index 59044e52..a00d6bde 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectGetScaleYUseCase.ts @@ -22,7 +22,7 @@ export const execute = (display_object: D): number => const EPS = 1e-12; - const sxAbs = Math.hypot(matrix[0], matrix[1]) + const sxAbs = Math.hypot(matrix[0], matrix[1]); const signX = (Math.abs(matrix[0]) >= EPS ? Math.sign(matrix[0]) : Math.sign(matrix[1])) || 1; return Math.round((matrix[0] * matrix[3] - matrix[1] * matrix[2]) / (sxAbs * signX) * 10000) / 10000; }; \ No newline at end of file diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts index a4c376f7..2eb57646 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts @@ -41,7 +41,7 @@ export const execute = (display_object: D, scale_x: num const sxAbs = Math.hypot(matrix.a, matrix.b); const signX = (Math.abs(matrix.a) >= EPS ? Math.sign(matrix.a) : Math.sign(matrix.b)) || 1; - + const sxSigned = sxAbs * signX; const thetaPos = sxSigned >= 0 ? theta : theta - Math.PI; const thetaUse = thetaPos + (scaleX < 0 ? Math.PI : 0); diff --git a/packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.ts b/packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.ts index 18f0a34b..a2555d12 100644 --- a/packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.ts +++ b/packages/display/src/TextField/usecase/TextFieldGenerateRenderQueueUseCase.ts @@ -43,7 +43,7 @@ export const execute = ( matrix: Float32Array, color_transform: Float32Array, renderer_width: number, - renderer_height: number, + renderer_height: number ): void => { if (!text_field.visible) { @@ -52,7 +52,7 @@ export const execute = ( } // transformed ColorTransform(tColorTransform) - const rawColor = displayObjectGetRawColorTransformUseCase(text_field); + const rawColor = displayObjectGetRawColorTransformUseCase(text_field as any); const tColorTransform = rawColor ? ColorTransform.multiply(color_transform, rawColor) : color_transform; @@ -67,7 +67,7 @@ export const execute = ( } // transformed matrix(tMatrix) - const rawMatrix = displayObjectGetRawMatrixUseCase(text_field); + const rawMatrix = displayObjectGetRawMatrixUseCase(text_field as any); const tMatrix = rawMatrix ? Matrix.multiply(matrix, rawMatrix) : matrix; From 4e3e21763261af5856fee49c786bd73908f6f0ad Mon Sep 17 00:00:00 2001 From: ienaga Date: Sun, 10 Aug 2025 21:36:43 +0900 Subject: [PATCH 7/8] =?UTF-8?q?#203=20=E5=A4=89=E5=BD=A2=E6=99=82=E3=81=AE?= =?UTF-8?q?=E3=82=AD=E3=83=A3=E3=83=83=E3=82=B7=E3=83=A5=E5=80=A4=E3=81=AE?= =?UTF-8?q?=E5=88=9D=E6=9C=9F=E5=8C=96=E3=82=BF=E3=82=A4=E3=83=9F=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=82=92=E6=94=B9=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 63 +++++-------------- .../DisplayObjectSetRotationUseCase.ts | 4 +- .../usecase/DisplayObjectSetScaleXUseCase.ts | 3 +- .../usecase/DisplayObjectSetScaleYUseCase.ts | 3 +- 4 files changed, 24 insertions(+), 49 deletions(-) diff --git a/index.html b/index.html index df87a329..df289199 100644 --- a/index.html +++ b/index.html @@ -10,16 +10,16 @@