mirror of
https://github.com/imgfloat/server.git
synced 2026-02-05 03:39:26 +00:00
Fix asset translation
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -6,3 +6,5 @@ local/
|
|||||||
*.log
|
*.log
|
||||||
.env
|
.env
|
||||||
*.db
|
*.db
|
||||||
|
*.db-shm
|
||||||
|
*.db-wal
|
||||||
|
|||||||
@@ -14,8 +14,10 @@ spring:
|
|||||||
thymeleaf:
|
thymeleaf:
|
||||||
cache: false
|
cache: false
|
||||||
datasource:
|
datasource:
|
||||||
url: jdbc:sqlite:imgfloat.db
|
url: jdbc:sqlite:imgfloat.db?busy_timeout=5000&journal_mode=WAL
|
||||||
driver-class-name: org.sqlite.JDBC
|
driver-class-name: org.sqlite.JDBC
|
||||||
|
hikari:
|
||||||
|
connection-init-sql: "PRAGMA journal_mode=WAL; PRAGMA busy_timeout=5000;"
|
||||||
jpa:
|
jpa:
|
||||||
hibernate:
|
hibernate:
|
||||||
ddl-auto: update
|
ddl-auto: update
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ const ctx = canvas.getContext('2d');
|
|||||||
canvas.width = window.innerWidth;
|
canvas.width = window.innerWidth;
|
||||||
canvas.height = window.innerHeight;
|
canvas.height = window.innerHeight;
|
||||||
const assets = new Map();
|
const assets = new Map();
|
||||||
|
const imageCache = new Map();
|
||||||
|
|
||||||
function connect() {
|
function connect() {
|
||||||
const socket = new SockJS('/ws');
|
const socket = new SockJS('/ws');
|
||||||
@@ -24,28 +25,46 @@ function renderAssets(list) {
|
|||||||
function handleEvent(event) {
|
function handleEvent(event) {
|
||||||
if (event.type === 'DELETED') {
|
if (event.type === 'DELETED') {
|
||||||
assets.delete(event.assetId);
|
assets.delete(event.assetId);
|
||||||
|
imageCache.delete(event.assetId);
|
||||||
} else if (event.payload && !event.payload.hidden) {
|
} else if (event.payload && !event.payload.hidden) {
|
||||||
assets.set(event.payload.id, event.payload);
|
assets.set(event.payload.id, event.payload);
|
||||||
|
ensureImage(event.payload);
|
||||||
} else if (event.payload && event.payload.hidden) {
|
} else if (event.payload && event.payload.hidden) {
|
||||||
assets.delete(event.payload.id);
|
assets.delete(event.payload.id);
|
||||||
|
imageCache.delete(event.payload.id);
|
||||||
}
|
}
|
||||||
draw();
|
draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
function draw() {
|
function draw() {
|
||||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
assets.forEach(asset => {
|
assets.forEach(drawAsset);
|
||||||
ctx.save();
|
}
|
||||||
ctx.globalAlpha = 1;
|
|
||||||
ctx.translate(asset.x, asset.y);
|
function drawAsset(asset) {
|
||||||
ctx.rotate(asset.rotation * Math.PI / 180);
|
ctx.save();
|
||||||
const image = new Image();
|
ctx.translate(asset.x, asset.y);
|
||||||
image.src = asset.url;
|
ctx.rotate(asset.rotation * Math.PI / 180);
|
||||||
image.onload = () => {
|
|
||||||
ctx.drawImage(image, 0, 0, asset.width, asset.height);
|
const image = ensureImage(asset);
|
||||||
};
|
if (image?.complete) {
|
||||||
ctx.restore();
|
ctx.drawImage(image, 0, 0, asset.width, asset.height);
|
||||||
});
|
}
|
||||||
|
|
||||||
|
ctx.restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureImage(asset) {
|
||||||
|
const cached = imageCache.get(asset.id);
|
||||||
|
if (cached && cached.src === asset.url) {
|
||||||
|
return cached;
|
||||||
|
}
|
||||||
|
|
||||||
|
const image = new Image();
|
||||||
|
image.onload = draw;
|
||||||
|
image.src = asset.url;
|
||||||
|
imageCache.set(asset.id, image);
|
||||||
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('resize', () => {
|
window.addEventListener('resize', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user