File size: 2,373 Bytes
2b7aae2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { createElementNS } from '../utils.js';
import { SRGBToLinear } from '../math/Color.js';

let _canvas;

class ImageUtils {
	static getDataURL(image) {
		if (/^data:/i.test(image.src)) {
			return image.src;
		}

		if (typeof HTMLCanvasElement == 'undefined') {
			return image.src;
		}

		let canvas;

		if (image instanceof HTMLCanvasElement) {
			canvas = image;
		} else {
			if (_canvas === undefined) _canvas = createElementNS('canvas');

			_canvas.width = image.width;
			_canvas.height = image.height;

			const context = _canvas.getContext('2d');

			if (image instanceof ImageData) {
				context.putImageData(image, 0, 0);
			} else {
				context.drawImage(image, 0, 0, image.width, image.height);
			}

			canvas = _canvas;
		}

		if (canvas.width > 2048 || canvas.height > 2048) {
			console.warn('THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image);

			return canvas.toDataURL('image/jpeg', 0.6);
		} else {
			return canvas.toDataURL('image/png');
		}
	}

	static sRGBToLinear(image) {
		if (
			(typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) ||
			(typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) ||
			(typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap)
		) {
			const canvas = createElementNS('canvas');

			canvas.width = image.width;
			canvas.height = image.height;

			const context = canvas.getContext('2d');
			context.drawImage(image, 0, 0, image.width, image.height);

			const imageData = context.getImageData(0, 0, image.width, image.height);
			const data = imageData.data;

			for (let i = 0; i < data.length; i++) {
				data[i] = SRGBToLinear(data[i] / 255) * 255;
			}

			context.putImageData(imageData, 0, 0);

			return canvas;
		} else if (image.data) {
			const data = image.data.slice(0);

			for (let i = 0; i < data.length; i++) {
				if (data instanceof Uint8Array || data instanceof Uint8ClampedArray) {
					data[i] = Math.floor(SRGBToLinear(data[i] / 255) * 255);
				} else {
					// assuming float

					data[i] = SRGBToLinear(data[i]);
				}
			}

			return {
				data: data,
				width: image.width,
				height: image.height,
			};
		} else {
			console.warn('THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.');
			return image;
		}
	}
}

export { ImageUtils };