From 85a9f4716894d1a0cba35abe099f4c59f31d7baa Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sun, 19 Oct 2025 13:30:42 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=E3=82=A6=E3=82=A9=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=83=9E=E3=83=BC=E3=82=AF=E3=82=92repeat=E3=81=97?= =?UTF-8?q?=E3=81=9F=E9=9A=9B=E3=81=AB=E5=9B=9E=E8=BB=A2=E3=82=84=E6=8B=A1?= =?UTF-8?q?=E5=A4=A7=E7=B8=AE=E5=B0=8F=E3=81=AE=E4=B8=AD=E5=BF=83=E3=81=8C?= =?UTF-8?q?=E3=80=8C=E4=BD=8D=E7=BD=AE=E3=80=8D=E8=A8=AD=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E8=80=83=E6=85=AE=E3=81=97=E3=81=AA=E3=81=84=E3=81=AE=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../image-effector/fxs/watermarkPlacement.ts | 67 +++++++++---------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/packages/frontend/src/utility/image-effector/fxs/watermarkPlacement.ts b/packages/frontend/src/utility/image-effector/fxs/watermarkPlacement.ts index 1eeb9f3401..6a9c576c54 100644 --- a/packages/frontend/src/utility/image-effector/fxs/watermarkPlacement.ts +++ b/packages/frontend/src/utility/image-effector/fxs/watermarkPlacement.ts @@ -74,13 +74,41 @@ void main() { vec2 wmSize = computeWmSize(outSize, u_wmResolution, u_cover, u_scale); vec2 margin = wmSize * u_margin; + // アライメントに基づく回転中心を計算 + float rotateX = 0.0; + float rotateY = 0.0; + if (abs(theta) > 1e-6 && !u_noBBoxExpansion) { + rotateX = abs(abs(wmSize.x * cos(theta)) + abs(wmSize.y * sin(theta)) - wmSize.x) * 0.5; + rotateY = abs(abs(wmSize.x * sin(theta)) + abs(wmSize.y * cos(theta)) - wmSize.y) * 0.5; + } + + float x; + if (u_alignX == 1) { + x = (outSize.x - wmSize.x) * 0.5; + } else if (u_alignX == 0) { + x = rotateX + margin.x; + } else { + x = outSize.x - wmSize.x - margin.x - rotateX; + } + + float y; + if (u_alignY == 1) { + y = (outSize.y - wmSize.y) * 0.5; + } else if (u_alignY == 0) { + y = rotateY + margin.y; + } else { + y = outSize.y - wmSize.y - margin.y - rotateY; + } + + vec2 rectMin = vec2(x, y); + vec2 rectMax = rectMin + wmSize; + vec2 rectCenter = (rectMin + rectMax) * 0.5; + vec4 wmCol = vec4(0.0); if (u_repeat) { - // リピートモード: テクスチャのWRAP属性(GL_REPEAT)を利用 - // スクリーン座標を回転させてタイル空間に変換 - vec2 center = outSize * 0.5; - vec2 q = center + rot(-theta) * (p - center); + // アライメントに基づく中心で回転 + vec2 q = rectCenter + rot(-theta) * (p - rectCenter); // タイルサイズ(ウォーターマーク + マージン)で正規化してUV座標に変換 vec2 tile = wmSize + margin * 2.0; @@ -92,36 +120,7 @@ void main() { // テクスチャのWRAP_REPEATにより自動的にタイル化される wmCol = texture(u_watermark, uvWm); } else { - // 非リピート: アライメントと回転に従い一枚だけ描画 - float rotateX = 0.0; - float rotateY = 0.0; - if (abs(theta) > 1e-6 && !u_noBBoxExpansion) { - rotateX = abs(abs(wmSize.x * cos(theta)) + abs(wmSize.y * sin(theta)) - wmSize.x) * 0.5; - rotateY = abs(abs(wmSize.x * sin(theta)) + abs(wmSize.y * cos(theta)) - wmSize.y) * 0.5; - } - - float x; - if (u_alignX == 1) { - x = (outSize.x - wmSize.x) * 0.5; - } else if (u_alignX == 0) { - x = rotateX + margin.x; - } else { - x = outSize.x - wmSize.x - margin.x - rotateX; - } - - float y; - if (u_alignY == 1) { - y = (outSize.y - wmSize.y) * 0.5; - } else if (u_alignY == 0) { - y = rotateY + margin.y; - } else { - y = outSize.y - wmSize.y - margin.y - rotateY; - } - - vec2 rectMin = vec2(x, y); - vec2 rectMax = rectMin + wmSize; - vec2 rectCenter = (rectMin + rectMax) * 0.5; - // 画素をウォーターマークのローカル座標へ(逆回転) + // アライメントと回転に従い一枚だけ描画 vec2 q = rectCenter + rot(-theta) * (p - rectCenter); bool inside = all(greaterThanEqual(q, rectMin)) && all(lessThan(q, rectMax)); if (inside) {