/*
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.gfx.gradutils"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.gfx.gradutils"] = true;
dojo.provide("dojox.gfx.gradutils");
dojo.require("dojox.gfx.matrix");
// Various generic utilities to deal with a linear gradient
(function(){
var d = dojo, m = dojox.gfx.matrix, C = d.Color;
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 d.blendColors(new C(prev.color), new C(stop.color),
(o - prev.offset) / (stop.offset - prev.offset));
}
return stop.color;
}
}
return c[len - 1].color;
}
dojox.gfx.gradutils.getColor = function(fill, pt){
// summary:
// sample a color from a gradient using a point
// fill: Object:
// fill object
// pt: dojox.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); // dojo.Color
}
// simple color
return new C(fill || [0, 0, 0, 0]); // dojo.Color
};
dojox.gfx.gradutils.reverse = function(fill){
// summary:
// reverses a gradient
// fill: Object:
// fill object
if(fill){
switch(fill.type){
case "linear":
case "radial":
fill = dojo.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
};
})();
}