This commit is contained in:
syuilo 2025-05-28 09:20:10 +09:00
parent 44212a31c9
commit e3aae009b4
2 changed files with 68 additions and 13 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

View File

@ -21,7 +21,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<div :class="$style.preview"> <div :class="$style.preview">
<canvas ref="canvasEl" :class="$style.previewCanvas"></canvas> <canvas ref="canvasEl" :class="$style.previewCanvas"></canvas>
<div :class="$style.previewContainer"> <div :class="$style.previewContainer">
<div class="_acrylic" :class="$style.watermarkEditorPreviewTitle">{{ i18n.ts.preview }}</div> <div class="_acrylic" :class="$style.previewTitle">{{ i18n.ts.preview }}</div>
<div class="_acrylic" :class="$style.previewControls">
<button class="_button" :class="[$style.previewControlsButton, sampleImageType === '3_2' ? $style.active : null]" @click="sampleImageType = '3_2'"><i class="ti ti-crop-landscape"></i></button>
<button class="_button" :class="[$style.previewControlsButton, sampleImageType === '2_3' ? $style.active : null]" @click="sampleImageType = '2_3'"><i class="ti ti-crop-portrait"></i></button>
</div>
</div> </div>
</div> </div>
<div :class="$style.controls" class="_gaps"> <div :class="$style.controls" class="_gaps">
@ -102,25 +106,60 @@ watch(preset, async (newValue, oldValue) => {
const canvasEl = useTemplateRef('canvasEl'); const canvasEl = useTemplateRef('canvasEl');
const sampleImage = new Image(); const sampleImage_3_2 = new Image();
sampleImage.src = '/client-assets/sample/3-2.jpg'; sampleImage_3_2.src = '/client-assets/sample/3-2.jpg';
const sampleImage_3_2_loading = new Promise<void>(resolve => {
sampleImage_3_2.onload = () => resolve();
});
const sampleImage_2_3 = new Image();
sampleImage_2_3.src = '/client-assets/sample/2-3.jpg';
const sampleImage_2_3_loading = new Promise<void>(resolve => {
sampleImage_2_3.onload = () => resolve();
});
const sampleImageType = ref('3_2');
watch(sampleImageType, async () => {
if (renderer != null) {
renderer.destroy();
renderer = null;
initRenderer();
}
});
let renderer: Watermarker | null = null; let renderer: Watermarker | null = null;
onMounted(() => { async function initRenderer() {
sampleImage.onload = async () => { if (canvasEl.value == null) return;
if (sampleImageType.value === '3_2') {
renderer = new Watermarker({ renderer = new Watermarker({
canvas: canvasEl.value, canvas: canvasEl.value,
width: 1500, width: 1500,
height: 1000, height: 1000,
preset: preset, preset: preset,
originalImage: sampleImage, originalImage: sampleImage_3_2,
}); });
} else if (sampleImageType.value === '2_3') {
renderer = new Watermarker({
canvas: canvasEl.value,
width: 1000,
height: 1500,
preset: preset,
originalImage: sampleImage_2_3,
});
}
await renderer.bakeTextures(); await renderer!.bakeTextures();
renderer.render(); renderer!.render();
}; }
onMounted(async () => {
await sampleImage_3_2_loading;
await sampleImage_2_3_loading;
initRenderer();
}); });
onUnmounted(() => { onUnmounted(() => {
@ -166,19 +205,17 @@ async function save() {
background-color: var(--MI_THEME-bg); background-color: var(--MI_THEME-bg);
background-size: auto auto; background-size: auto auto;
background-image: repeating-linear-gradient(135deg, transparent, transparent 6px, var(--MI_THEME-panel) 6px, var(--MI_THEME-panel) 12px); background-image: repeating-linear-gradient(135deg, transparent, transparent 6px, var(--MI_THEME-panel) 6px, var(--MI_THEME-panel) 12px);
cursor: not-allowed;
} }
.previewContainer { .previewContainer {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
pointer-events: none;
user-select: none; user-select: none;
-webkit-user-drag: none; -webkit-user-drag: none;
} }
.watermarkEditorPreviewTitle { .previewTitle {
position: absolute; position: absolute;
z-index: 100; z-index: 100;
top: 8px; top: 8px;
@ -188,7 +225,25 @@ async function save() {
font-size: 85%; font-size: 85%;
} }
.watermarkEditorPreviewSpinner { .previewControls {
position: absolute;
z-index: 100;
bottom: 8px;
right: 8px;
display: flex;
align-items: center;
gap: 8px;
padding: 6px 10px;
border-radius: 6px;
}
.previewControlsButton {
&.active {
color: var(--MI_THEME-accent);
}
}
.previewSpinner {
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50%; left: 50%;