-
Notifications
You must be signed in to change notification settings - Fork 0
/
pixellist.js-e
112 lines (103 loc) · 3.1 KB
/
pixellist.js-e
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
## Copyright (c) 2015, Empirical Modelling Group
## All rights reserved.
##
## See LICENSE.txt
/*
* Returns a PixelList drawable. The ptrToData argument should be a pointer to a list of
* integers. The first four elements of the list represent the red, green, blue and
* alpha components of the first pixel respectively (all in the range 0-255). The
* next four elements represent the second pixel, going from left to right along the
* top line of the block. The data list should contain data for an exact number
* of rows of the specified width. Although cumbersome a PixelList performs far
* faster than trying to map each pixel to an individual EDEN observable for a
* block of any significant size.
*
* N.B. Unfortunately the alpha values are not true transparency. That is, you
* you can't see through to other objects drawn underneath on the canvas. Alpha
* values less than 255 just make the colours lighter.
*
* Example:
* ```
* func colourMap {
* para b;
* auto data, i, j;
* data = [];
* for (j = 0; j <= 255; j++) {
* for (i = 0; i <= 255; i++) {
* append data, i;
* append data, j;
* append data, b;
* append data, 255;
* }
* }
* return data;
* }
*
* blue = 50;
* pixelData is colourMap(blue);
* pixels is PixelList(&pixelData, 20, 20, 256);
* picture is [pixels];
*
* @param [name]
* @param ptrToData pointer to list of R,G,B,Alpha values
* @param x x-position
* @param y y-position
* @param width
*
* #canvas #pixellist
*/
func PixelList {
${{
var name;
var argsProcessed;
if (typeof(arguments[0]) == "string") {
name = arguments[0];
argsProcessed = 1;
} else {
argsProcessed = 0;
}
var ptrToData = arguments[argsProcessed];
argsProcessed++;
var x = arguments[argsProcessed];
argsProcessed++;
var y = arguments[argsProcessed];
argsProcessed++;
var width = arguments[argsProcessed];
argsProcessed++;
return new PixelList(name, ptrToData, x, y, width);
}}$;
}
${{
PixelList = function(name, ptrToData, x, y, width) {
this.name = edenUI.plugins.Canvas2D.initZoneFromName(name, "PixelList");
this.obsName = root.currentObservableName();
this.ptr = ptrToData;
this.data = ptrToData instanceof Symbol? ptrToData.value() : [];
this.x = x;
this.y = y;
this.width = width;
this.height = this.data.length / (4 * width);
}
PixelList.prototype.draw = function (context) {
var imageData = context.createImageData(this.width, this.height);
var imageArr = imageData.data;
var dataArr = this.data;
var arrayLen = dataArr.length;
for (var i = 0; i < arrayLen; i++) {
imageArr[i] = dataArr[i];
}
context.putImageData(imageData, this.x, this.y);
}
PixelList.prototype.isHit = function (context, scale, x, y) {
return x >= this.x && x < this.x + this.width && y >= this.y && y < this.y + this.height;
}
PixelList.prototype.toString = function() {
var s = "PixelList(";
if (this.name !== undefined) {
s = s + Eden.edenCodeForValue(this.name) + ", ";
}
s = s + Eden.edenCodeForValues(this.ptr, this.x, this.y, this.width) + ")";
return s;
}
PixelList.prototype.getEdenCode = PixelList.prototype.toString;
}}$;