-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathgradutils.js
More file actions
90 lines (84 loc) · 2.37 KB
/
gradutils.js
File metadata and controls
90 lines (84 loc) · 2.37 KB
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
// Various generic utilities to deal with a linear gradient
define(["./_base", "dojo/_base/lang", "./matrix", "dcolor/Color", "dcolor/utils"],
function (g, lang, m, Color, colorUtils) {
var gradutils = g.gradutils = {};
function findColor(o, c) {
if (o <= 0) {
return c[0].color;
}
var len = c.length;
if (o >= 1) {
return c[len - 1].color;
}
//TODO: use binary search
for (var i = 0; i < len; ++i) {
var stop = c[i];
if (stop.offset >= o) {
if (i) {
var prev = c[i - 1];
return colorUtils.blendColors(new Color(prev.color), new Color(stop.color),
(o - prev.offset) / (stop.offset - prev.offset));
}
return stop.color;
}
}
return c[len - 1].color;
}
gradutils.getColor = function (fill, pt) {
// summary:
// sample a color from a gradient using a point
// fill: Object
// fill object
// pt: gfx.Point
// point where to sample a color
var o;
if (fill) {
switch (fill.type) {
case "linear":
var angle = Math.atan2(fill.y2 - fill.y1,
fill.x2 - fill.x1), rotation = m.rotate(-angle), projection = m.project(fill.x2 - fill.x1,
fill.y2 - fill.y1), p = m.multiplyPoint(projection, pt), pf1 = m.multiplyPoint(projection,
fill.x1, fill.y1), pf2 = m.multiplyPoint(projection, fill.x2,
fill.y2), scale = m.multiplyPoint(rotation, pf2.x - pf1.x, pf2.y - pf1.y).x;
o = m.multiplyPoint(rotation, p.x - pf1.x, p.y - pf1.y).x / scale;
break;
case "radial":
var dx = pt.x - fill.cx, dy = pt.y - fill.cy;
o = Math.sqrt(dx * dx + dy * dy) / fill.r;
break;
}
return findColor(o, fill.colors); // dcolor/Color
}
// simple color
return new Color(fill || [0, 0, 0, 0]); // dcolor/Color
};
gradutils.reverse = function (fill) {
// summary:
// reverses a gradient
// fill: Object
// fill object
if (fill) {
switch (fill.type) {
case "linear":
case "radial":
fill = lang.delegate(fill);
if (fill.colors) {
var c = fill.colors, l = c.length, i = 0, stop, n = fill.colors = new Array(c.length);
for (; i < l; ++i) {
stop = c[i];
n[i] = {
offset: 1 - stop.offset,
color: stop.color
};
}
n.sort(function (a, b) {
return a.offset - b.offset;
});
}
break;
}
}
return fill; // Object
};
return gradutils;
});