aboutsummaryrefslogtreecommitdiff
path: root/llama.cpp/tools/server/webui/src/lib/utils/svg-to-png.ts
blob: d5a7f7d8340d159e2e14fddf15352181b01b3ad4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import { MimeTypeImage } from '$lib/enums';

/**
 * Convert an SVG base64 data URL to a PNG data URL
 * @param base64UrlSvg - The SVG base64 data URL to convert
 * @param backgroundColor - Background color for the PNG (default: 'white')
 * @returns Promise resolving to PNG data URL
 */
export function svgBase64UrlToPngDataURL(
	base64UrlSvg: string,
	backgroundColor: string = 'white'
): Promise<string> {
	return new Promise((resolve, reject) => {
		try {
			const img = new Image();

			img.onload = () => {
				const canvas = document.createElement('canvas');
				const ctx = canvas.getContext('2d');

				if (!ctx) {
					reject(new Error('Failed to get 2D canvas context.'));
					return;
				}

				const targetWidth = img.naturalWidth || 300;
				const targetHeight = img.naturalHeight || 300;

				canvas.width = targetWidth;
				canvas.height = targetHeight;

				if (backgroundColor) {
					ctx.fillStyle = backgroundColor;
					ctx.fillRect(0, 0, canvas.width, canvas.height);
				}
				ctx.drawImage(img, 0, 0, targetWidth, targetHeight);

				resolve(canvas.toDataURL(MimeTypeImage.PNG));
			};

			img.onerror = () => {
				reject(new Error('Failed to load SVG image. Ensure the SVG data is valid.'));
			};

			img.src = base64UrlSvg;
		} catch (error) {
			const message = error instanceof Error ? error.message : String(error);
			const errorMessage = `Error converting SVG to PNG: ${message}`;
			console.error(errorMessage, error);
			reject(new Error(errorMessage));
		}
	});
}

/**
 * Check if a file is an SVG based on its MIME type
 * @param file - The file to check
 * @returns True if the file is an SVG
 */
export function isSvgFile(file: File): boolean {
	return file.type === MimeTypeImage.SVG;
}

/**
 * Check if a MIME type represents an SVG
 * @param mimeType - The MIME type to check
 * @returns True if the MIME type is image/svg+xml
 */
export function isSvgMimeType(mimeType: string): boolean {
	return mimeType === MimeTypeImage.SVG;
}