Blame | Last modification | View Log | RSS feed
if(!dojo._hasResource["dojox.gfx._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojox.gfx._base"] = true;dojo.provide("dojox.gfx._base");// candidates for dojox.style (work on VML and SVG nodes)dojox.gfx._hasClass = function(/*DomNode*/node, /*String*/classStr){// summary:// Returns whether or not the specified classes are a portion of the// class list currently applied to the node.// return (new RegExp('(^|\\s+)'+classStr+'(\\s+|$)')).test(node.className) // Booleanreturn ((" "+node.getAttribute("className")+" ").indexOf(" "+classStr+" ") >= 0); // Boolean}dojox.gfx._addClass = function(/*DomNode*/node, /*String*/classStr){// summary:// Adds the specified classes to the end of the class list on the// passed node.var cls = node.getAttribute("className");if((" "+cls+" ").indexOf(" "+classStr+" ") < 0){node.setAttribute("className", cls + (cls ? ' ' : '') + classStr);}}dojox.gfx._removeClass = function(/*DomNode*/node, /*String*/classStr){// summary: Removes classes from node.node.setAttribute("className", node.getAttribute("className").replace(new RegExp('(^|\\s+)'+classStr+'(\\s+|$)'), "$1$2"));}// candidate for dojox.html.metrics (dynamic font resize handler is not implemented here)// derived from Morris John's emResized measurerdojox.gfx._base._getFontMeasurements = function(){// summary// Returns an object that has pixel equivilents of standard font size values.var heights = {'1em':0, '1ex':0, '100%':0, '12pt':0, '16px':0, 'xx-small':0, 'x-small':0,'small':0, 'medium':0, 'large':0, 'x-large':0, 'xx-large':0};if(dojo.isIE){// we do a font-size fix if and only if one isn't applied already.// NOTE: If someone set the fontSize on the HTML Element, this will kill it.dojo.doc.documentElement.style.fontSize="100%";}// set up the measuring node.var div=dojo.doc.createElement("div");div.style.position="absolute";div.style.left="-100px";div.style.top="0";div.style.width="30px";div.style.height="1000em";div.style.border="0";div.style.margin="0";div.style.padding="0";div.style.outline="0";div.style.lineHeight="1";div.style.overflow="hidden";dojo.body().appendChild(div);// do the measurements.for(var p in heights){div.style.fontSize = p;heights[p] = Math.round(div.offsetHeight * 12/16) * 16/12 / 1000;}dojo.body().removeChild(div);div = null;return heights; // object};dojox.gfx._base._fontMeasurements = null;dojox.gfx._base._getCachedFontMeasurements = function(recalculate){if(recalculate || !dojox.gfx._base._fontMeasurements){dojox.gfx._base._fontMeasurements = dojox.gfx._base._getFontMeasurements();}return dojox.gfx._base._fontMeasurements;};// candidate for dojo.domdojox.gfx._base._uniqueId = 0;dojox.gfx._base._getUniqueId = function(){// summary: returns a unique string for use with any DOM elementvar id;do{id = "dojoUnique" + (++dojox.gfx._base._uniqueId);}while(dojo.byId(id));return id;};dojo.mixin(dojox.gfx, {// summary: defines constants, prototypes, and utility functions// default shapes, which are used to fill in missing parametersdefaultPath: {type: "path", path: ""},defaultPolyline: {type: "polyline", points: []},defaultRect: {type: "rect", x: 0, y: 0, width: 100, height: 100, r: 0},defaultEllipse: {type: "ellipse", cx: 0, cy: 0, rx: 200, ry: 100},defaultCircle: {type: "circle", cx: 0, cy: 0, r: 100},defaultLine: {type: "line", x1: 0, y1: 0, x2: 100, y2: 100},defaultImage: {type: "image", x: 0, y: 0, width: 0, height: 0, src: ""},defaultText: {type: "text", x: 0, y: 0, text: "",align: "start", decoration: "none", rotated: false, kerning: true },defaultTextPath: {type: "textpath", text: "",align: "start", decoration: "none", rotated: false, kerning: true },// default geometric attributesdefaultStroke: {type: "stroke", color: "black", style: "solid", width: 1, cap: "butt", join: 4},defaultLinearGradient: {type: "linear", x1: 0, y1: 0, x2: 100, y2: 100,colors: [{offset: 0, color: "black"}, {offset: 1, color: "white"}]},defaultRadialGradient: {type: "radial", cx: 0, cy: 0, r: 100,colors: [{offset: 0, color: "black"}, {offset: 1, color: "white"}]},defaultPattern: {type: "pattern", x: 0, y: 0, width: 0, height: 0, src: ""},defaultFont: {type: "font", style: "normal", variant: "normal", weight: "normal",size: "10pt", family: "serif"},normalizeColor: function(/*Color*/ color){// summary: converts any legal color representation to normalized dojo.Color objectreturn (color instanceof dojo.Color) ? color : new dojo.Color(color); // dojo.Color},normalizeParameters: function(existed, update){// summary: updates an existing object with properties from an "update" object// existed: Object: the "target" object to be updated// update: Object: the "update" object, whose properties will be used to update the existed objectif(update){var empty = {};for(var x in existed){if(x in update && !(x in empty)){existed[x] = update[x];}}}return existed; // Object},makeParameters: function(defaults, update){// summary: copies the original object, and all copied properties from the "update" object// defaults: Object: the object to be cloned before updating// update: Object: the object, which properties are to be cloned during updatingif(!update) return dojo.clone(defaults);var result = {};for(var i in defaults){if(!(i in result)){result[i] = dojo.clone((i in update) ? update[i] : defaults[i]);}}return result; // Object},formatNumber: function(x, addSpace){// summary: converts a number to a string using a fixed notation// x: Number: number to be converted// addSpace: Boolean?: if it is true, add a space before a positive numbervar val = x.toString();if(val.indexOf("e") >= 0){val = x.toFixed(4);}else{var point = val.indexOf(".");if(point >= 0 && val.length - point > 5){val = x.toFixed(4);}}if(x < 0){return val; // String}return addSpace ? " " + val : val; // String},// font operationsmakeFontString: function(font){// summary: converts a font object to a CSS font string// font: Object: font object (see dojox.gfx.defaultFont)return font.style + " " + font.variant + " " + font.weight + " " + font.size + " " + font.family; // Object},splitFontString: function(str){// summary: converts a CSS font string to a font object// str: String: a CSS font stringvar font = dojo.clone(dojox.gfx.defaultFont);var t = str.split(/\s+/);do{if(t.length < 5){ break; }font.style = t[0];font.varian = t[1];font.weight = t[2];var i = t[3].indexOf("/");font.size = i < 0 ? t[3] : t[3].substring(0, i);var j = 4;if(i < 0){if(t[4] == "/"){j = 6;break;}if(t[4].substr(0, 1) == "/"){j = 5;break;}}if(j + 3 > t.length){ break; }font.size = t[j];font.family = t[j + 1];}while(false);return font; // Object},// length operationscm_in_pt: 72 / 2.54, // Number: centimeters per inchmm_in_pt: 7.2 / 2.54, // Number: millimeters per inchpx_in_pt: function(){// summary: returns a number of pixels per pointreturn dojox.gfx._base._getCachedFontMeasurements()["12pt"] / 12; // Number},pt2px: function(len){// summary: converts points to pixels// len: Number: a value in pointsreturn len * dojox.gfx.px_in_pt(); // Number},px2pt: function(len){// summary: converts pixels to points// len: Number: a value in pixelsreturn len / dojox.gfx.px_in_pt(); // Number},normalizedLength: function(len) {// summary: converts any length value to pixels// len: String: a length, e.g., "12pc"if(len.length == 0) return 0;if(len.length > 2){var px_in_pt = dojox.gfx.px_in_pt();var val = parseFloat(len);switch(len.slice(-2)){case "px": return val;case "pt": return val * px_in_pt;case "in": return val * 72 * px_in_pt;case "pc": return val * 12 * px_in_pt;case "mm": return val / dojox.gfx.mm_in_pt * px_in_pt;case "cm": return val / dojox.gfx.cm_in_pt * px_in_pt;}}return parseFloat(len); // Number},// a constant used to split a SVG/VML path into primitive componentspathVmlRegExp: /([A-Za-z]+)|(\d+(\.\d+)?)|(\.\d+)|(-\d+(\.\d+)?)|(-\.\d+)/g,pathSvgRegExp: /([A-Za-z])|(\d+(\.\d+)?)|(\.\d+)|(-\d+(\.\d+)?)|(-\.\d+)/g,equalSources: function(a, b){// summary: compares event sources, returns true if they are equalreturn a && b && a == b;}});}