-
Notifications
You must be signed in to change notification settings - Fork 0
/
pixel-map.js
70 lines (59 loc) · 1.34 KB
/
pixel-map.js
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
function PixelMap(imageData) {
this.imageData = imageData;
}
Object.defineProperty(PixelMap.prototype, 'width', {
get: function() {
return this.imageData.width;
}
});
Object.defineProperty(PixelMap.prototype, 'height', {
get: function() {
return this.imageData.height;
}
});
PixelMap.prototype.at = function(row, col) {
if (row < 0 || row >= this.imageData.height ||
col < 0 || col >= this.imageData.width)
{
throw new RangeError('Pixel index out of bounds');
}
return this.atIndex(row * this.imageData.width + col);
}
PixelMap.prototype.atIndex = function(pixelIndex) {
if (pixelIndex < 0 || pixelIndex >= this.imageData.width * this.imageData.height) {
throw new RangeError('Pixel index out of bounds');
}
const data = this.imageData.data;
const dataIndex = pixelIndex * 4;
return {
// Red
get r() {
return data[dataIndex + 0];
},
set r(val) {
data[dataIndex + 0] = val;
},
// Green
get g() {
return data[dataIndex + 1];
},
set g(val) {
data[dataIndex + 1] = val;
},
// Blue
get b() {
return data[dataIndex + 2];
},
set b(val) {
data[dataIndex + 2] = val;
},
// Alpha
get a() {
return data[dataIndex + 3];
},
set a(val) {
data[dataIndex + 3] = val;
},
}
}
export default PixelMap;