diff --git a/index.html b/index.html
index df87a329..a593e24f 100644
--- a/index.html
+++ b/index.html
@@ -33,48 +33,19 @@
// DisplacementMapFilter
// } = next2d.filters;
- // const image = new Image();
- // image.addEventListener("load", () =>
- // {
- // const bitmapData = new BitmapData();
- // bitmapData.image = image;
-
- // const shape = root.addChild(new Shape());
- // shape.x = 150;
- // shape.y = 150;
+ // const shape = root.addChild(new Shape());
+ // shape.x = 150;
+ // shape.y = 150;
- // shape.addEventListener(Event.COMPLETE, () =>
- // {
- // shape.scaleX = 0.5;
- // shape.scaleY = 0.5;
- // shape.filters = [
- // // new BlurFilter(10, 10, 3),
- // // new DropShadowFilter(20, 45, 0, 0.5),
- // // new ColorMatrixFilter([
- // // 0.393, 0.769, 0.189, 0, 0,
- // // 0.349, 0.686, 0.168, 0, 0,
- // // 0.272, 0.534, 0.131, 0, 0,
- // // 0, 0, 0, 1, 0
- // // ]),
- // // new GlowFilter(0, 1, 30, 20, 1, 1),
- // // new BevelFilter(4, 45, 0x0000ff, 1, 0, 1, 10, 10, 2, 1),
- // // new GradientBevelFilter(80, 45, [0x0000ff, 0x00ff00, 0xff0000], [0, 0.5, 1], [0, 128, 255], 4, 4, 1, 1),
- // // new GradientGlowFilter(4, 45, [0x000000, 0xffffff], [0, 1], [0, 255], 4, 4, 1, 1),
- // // new ConvolutionFilter(3, 3, [
- // // 0, -0.25, 0,
- // // -0.25, 4, -0.25,
- // // 0, -0.25, 0
- // // ], 1, 3, false, false),
- // new DisplacementMapFilter(
- // bitmapData.buffer, bitmapData.width, bitmapData.height, 40, 40,
- // 1, 4, 32, 32
- // )
- // ];
- // });
-
- // shape.src = "http://localhost:5173/json/image/logo.png";
+ // shape.addEventListener(Event.COMPLETE, () =>
+ // {
+ // shape.rotation = 190;
+ // shape.scaleX = 0.25;
+ // shape.scaleY = 0.25;
+ // console.log(shape.rotation);
// });
- // image.src = "http://localhost:5173/json/image/image.png";
+
+ // shape.src = "http://localhost:5173/json/image/logo.png";
// const shape1 = root.addChild(new Shape());
// shape1.x = 150;
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"
},
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..f7435008 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.hypot(matrix[0], matrix[1]);
- return 0 > matrix[0] ? xScale * -1 : xScale;
+ 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..a00d6bde 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/DisplayObjectSetRotationUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.ts
index 77216371..2cadf64a 100644
--- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.ts
+++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.ts
@@ -22,7 +22,7 @@ const $Deg2Rad: number = Math.PI / 180;
*/
export const execute = (display_object: D, rotation: number): void =>
{
- rotation = $clamp(rotation % 360, 0 - 360, 360, 0);
+ rotation = $clamp(rotation % 360, -360, 360, 0);
if (display_object.$rotation === rotation) {
return ;
}
@@ -66,6 +66,8 @@ export const execute = (display_object: D, rotation: nu
}
}
+ display_object.$scaleX = null;
+ display_object.$scaleY = null;
display_object.$rotation = rotation;
displayObjectApplyChangesService(display_object);
};
\ No newline at end of file
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..aeebc4b3 100644
--- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts
+++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleXUseCase.ts
@@ -33,20 +33,25 @@ 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;
- }
+ const sxAbs = Math.hypot(matrix.a, matrix.b);
+ const signX = (Math.abs(matrix.a) >= EPS ? Math.sign(matrix.a) : Math.sign(matrix.b)) || 1;
- matrix.b = scale_x * Math.sin(radianX);
- matrix.a = scale_x * Math.cos(radianX);
+ const sxSigned = sxAbs * signX;
+ 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;
+ display_object.$scaleX = scaleX;
+ display_object.$rotation = null;
displayObjectApplyChangesService(display_object);
};
\ No newline at end of file
diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.ts
index 90659939..8d058272 100644
--- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.ts
+++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetScaleYUseCase.ts
@@ -33,19 +33,31 @@ 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;
+ display_object.$scaleY = scaleY;
+ display_object.$rotation = null;
displayObjectApplyChangesService(display_object);
};
\ No newline at end of file
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);
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;
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",
"");