enhance: add settings for noBoundingBoxExpansion

This commit is contained in:
kakkokari-gtyih 2025-10-17 20:24:35 +09:00
parent 5594341218
commit e0b528d995
5 changed files with 42 additions and 2 deletions

8
locales/index.d.ts vendored
View File

@ -12341,6 +12341,14 @@ export interface Locale extends ILocale {
* *
*/ */
"repeat": string; "repeat": string;
/**
*
*/
"preserveBoundingRect": string;
/**
*
*/
"preserveBoundingRectDescription": string;
/** /**
* *
*/ */

View File

@ -3304,6 +3304,8 @@ _watermarkEditor:
title: "ウォーターマークの編集" title: "ウォーターマークの編集"
cover: "全体に被せる" cover: "全体に被せる"
repeat: "敷き詰める" repeat: "敷き詰める"
preserveBoundingRect: "回転した分の面積を確保する"
preserveBoundingRectDescription: "通常はオンで問題ありません。ウォーターマークを回転させた際に余白が不自然になった場合はオフにしてみてください。"
opacity: "不透明度" opacity: "不透明度"
scale: "サイズ" scale: "サイズ"
text: "テキスト" text: "テキスト"

View File

@ -65,6 +65,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkSwitch v-model="layer.repeat"> <MkSwitch v-model="layer.repeat">
<template #label>{{ i18n.ts._watermarkEditor.repeat }}</template> <template #label>{{ i18n.ts._watermarkEditor.repeat }}</template>
</MkSwitch> </MkSwitch>
<MkSwitch v-model="layerPreserveBoundingRect">
<template #label>{{ i18n.ts._watermarkEditor.preserveBoundingRect }}</template>
<template #caption>{{ i18n.ts._watermarkEditor.preserveBoundingRectDescription }}</template>
</MkSwitch>
</template> </template>
<template v-else-if="layer.type === 'image'"> <template v-else-if="layer.type === 'image'">
@ -129,6 +134,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkSwitch v-model="layer.cover"> <MkSwitch v-model="layer.cover">
<template #label>{{ i18n.ts._watermarkEditor.cover }}</template> <template #label>{{ i18n.ts._watermarkEditor.cover }}</template>
</MkSwitch> </MkSwitch>
<MkSwitch v-model="layerPreserveBoundingRect">
<template #label>{{ i18n.ts._watermarkEditor.preserveBoundingRect }}</template>
<template #caption>{{ i18n.ts._watermarkEditor.preserveBoundingRectDescription }}</template>
</MkSwitch>
</template> </template>
<template v-else-if="layer.type === 'qr'"> <template v-else-if="layer.type === 'qr'">
@ -335,7 +345,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from 'vue'; import { ref, onMounted, computed } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import type { WatermarkPreset } from '@/utility/watermark.js'; import type { WatermarkPreset } from '@/utility/watermark.js';
import { i18n } from '@/i18n.js'; import { i18n } from '@/i18n.js';
@ -351,6 +361,20 @@ import { misskeyApi } from '@/utility/misskey-api.js';
const layer = defineModel<WatermarkPreset['layers'][number]>('layer', { required: true }); const layer = defineModel<WatermarkPreset['layers'][number]>('layer', { required: true });
const layerPreserveBoundingRect = computed({
get: () => {
if (layer.value.type === 'text' || layer.value.type === 'image') {
return !layer.value.noBoundingBoxExpansion;
}
return false;
},
set: (v: boolean) => {
if (layer.value.type === 'text' || layer.value.type === 'image') {
layer.value.noBoundingBoxExpansion = !v;
}
},
});
const driveFile = ref<Misskey.entities.DriveFile | null>(null); const driveFile = ref<Misskey.entities.DriveFile | null>(null);
const driveFileError = ref(false); const driveFileError = ref(false);
onMounted(async () => { onMounted(async () => {

View File

@ -90,6 +90,7 @@ function createTextLayer(): WatermarkPreset['layers'][number] {
angle: 0, angle: 0,
opacity: 0.75, opacity: 0.75,
repeat: false, repeat: false,
noBoundingBoxExpansion: false,
}; };
} }
@ -104,6 +105,7 @@ function createImageLayer(): WatermarkPreset['layers'][number] {
angle: 0, angle: 0,
opacity: 0.75, opacity: 0.75,
repeat: false, repeat: false,
noBoundingBoxExpansion: false,
cover: false, cover: false,
}; };
} }
@ -261,7 +263,7 @@ async function initRenderer() {
await renderer!.setLayers(preset.layers); await renderer!.setLayers(preset.layers);
renderer!.render(); await renderer!.render();
} }
onMounted(async () => { onMounted(async () => {

View File

@ -27,6 +27,7 @@ export type WatermarkPreset = {
type: 'text'; type: 'text';
text: string; text: string;
repeat: boolean; repeat: boolean;
noBoundingBoxExpansion: boolean;
scale: number; scale: number;
angle: number; angle: number;
align: Align; align: Align;
@ -38,6 +39,7 @@ export type WatermarkPreset = {
imageId: string | null; imageId: string | null;
cover: boolean; cover: boolean;
repeat: boolean; repeat: boolean;
noBoundingBoxExpansion: boolean;
scale: number; scale: number;
angle: number; angle: number;
align: Align; align: Align;
@ -106,6 +108,7 @@ export class WatermarkRenderer {
id: layer.id, id: layer.id,
params: { params: {
repeat: layer.repeat, repeat: layer.repeat,
noBoundingBoxExpansion: layer.noBoundingBoxExpansion,
scale: layer.scale, scale: layer.scale,
align: layer.align, align: layer.align,
angle: layer.angle, angle: layer.angle,
@ -123,6 +126,7 @@ export class WatermarkRenderer {
id: layer.id, id: layer.id,
params: { params: {
repeat: layer.repeat, repeat: layer.repeat,
noBoundingBoxExpansion: layer.noBoundingBoxExpansion,
scale: layer.scale, scale: layer.scale,
align: layer.align, align: layer.align,
angle: layer.angle, angle: layer.angle,