34 lines
1.4 KiB
JavaScript
34 lines
1.4 KiB
JavaScript
// Rôle : normalise les traits de dessin persistés par les outils annotables.
|
|
import { uid } from "./shared.js";
|
|
|
|
export const NOTEPAD_ALLOWED_COLORS = new Set(["#f5f7ff", "#b4bdd3", "#f6c453", "#22d3ee", "#8b5cf6", "#d946ef", "#101426", "#202745"]);
|
|
|
|
function normalizeDrawingPoint(point, options = {}) {
|
|
const x = Number(point?.x);
|
|
const y = Number(point?.y);
|
|
if (!Number.isFinite(x) || !Number.isFinite(y)) return null;
|
|
const max = Number(options.max);
|
|
return {
|
|
x: Math.min(Number.isFinite(max) ? max : Number.POSITIVE_INFINITY, Math.max(0, Math.round(x * 100) / 100)),
|
|
y: Math.min(Number.isFinite(max) ? max : Number.POSITIVE_INFINITY, Math.max(0, Math.round(y * 100) / 100))
|
|
};
|
|
}
|
|
|
|
function normalizeDrawingStroke(stroke, options = {}) {
|
|
const points = (Array.isArray(stroke?.points) ? stroke.points : []).map((point) => normalizeDrawingPoint(point, options)).filter(Boolean);
|
|
if (points.length < 2) return null;
|
|
const color = NOTEPAD_ALLOWED_COLORS.has(String(stroke?.color || "").toLowerCase()) ? String(stroke.color).toLowerCase() : "#f6c453";
|
|
const width = Math.min(24, Math.max(1, Number(stroke?.width) || 4));
|
|
return {
|
|
id: stroke?.id || uid("stroke"),
|
|
color,
|
|
width: Math.round(width * 10) / 10,
|
|
points
|
|
};
|
|
}
|
|
|
|
export function normalizeDrawingData(data, options = {}) {
|
|
return {
|
|
strokes: (Array.isArray(data?.strokes) ? data.strokes : []).map((stroke) => normalizeDrawingStroke(stroke, options)).filter(Boolean)
|
|
};
|
|
}
|