From e64bee32a806d769a8f2f5eb85503d6d5abe0268 Mon Sep 17 00:00:00 2001 From: Jeff Schiller Date: Sat, 6 Nov 2010 00:45:21 +0000 Subject: [PATCH] Move a couple functions into units.js git-svn-id: http://svg-edit.googlecode.com/svn/trunk@1848 eee81c28-f429-11dd-99c0-75d572ba1ddd --- editor/extensions/ext-grid.js | 6 +- editor/svg-editor.js | 7 ++- editor/svgcanvas.js | 109 +++++++++------------------------- editor/units.js | 87 +++++++++++++++++++++++---- 4 files changed, 115 insertions(+), 94 deletions(-) diff --git a/editor/extensions/ext-grid.js b/editor/extensions/ext-grid.js index bbb7e084..c6be63b8 100644 --- a/editor/extensions/ext-grid.js +++ b/editor/extensions/ext-grid.js @@ -8,6 +8,10 @@ * */ +// Dependencies: +// 1) units.js +// 2) everything else + svgEditor.addExtension("view_grid", function(s) { var svgdoc = document.getElementById("svgcanvas").ownerDocument, @@ -78,7 +82,7 @@ svgEditor.addExtension("view_grid", function(s) { var bgwidth = +canvBG.attr('width'); var bgheight = +canvBG.attr('height'); - var units = svgCanvas.getUnits(); + var units = svgedit.units.getTypeMap(); var unit = units[svgEditor.curConfig.baseUnit]; // 1 = 1px var r_intervals = [.01, .1, 1, 10, 100, 1000]; diff --git a/editor/svg-editor.js b/editor/svg-editor.js index b1fec63c..94a57218 100644 --- a/editor/svg-editor.js +++ b/editor/svg-editor.js @@ -10,6 +10,9 @@ * */ +// Dependencies: +// 1) svgcanvas.js + (function() { if(!window.svgEditor) window.svgEditor = function($) { @@ -1816,7 +1819,7 @@ } else if(curConfig.baseUnit !== 'px') { // Convert unitless value to one with given unit - var unitData = svgCanvas.getUnits(); + var unitData = svgedit.units.getTypeMap(); if(selectedElement[attr] || svgCanvas.getMode() === "pathedit" || attr === "x" || attr === "y") { val *= unitData[curConfig.baseUnit]; @@ -4270,7 +4273,7 @@ var c_elem = svgCanvas.getContentElem(); - var units = svgCanvas.getUnits(); + var units = svgedit.units.getTypeMap(); var unit = units[curConfig.baseUnit]; // 1 = 1px for(var d = 0; d < 2; d++) { diff --git a/editor/svgcanvas.js b/editor/svgcanvas.js index 4dbbcea1..16b13b9b 100644 --- a/editor/svgcanvas.js +++ b/editor/svgcanvas.js @@ -97,6 +97,16 @@ if(window.opera) { // config - An object that contains configuration data $.SvgCanvas = function(container, config) { +// Default configuration options +var curConfig = { + show_outside_canvas: true, + dimensions: [640, 480] +}; + +// Update config with new one if given +if(config) { + $.extend(curConfig, config); +} // import svgtransformlist.js var getTransformList = this.getTransformList = svgedit.transformlist.getTransformList; @@ -111,8 +121,9 @@ var transformListToTransform = this.transformListToTransform = svgedit.math.tran var snapToAngle = svgedit.math.snapToAngle; // import from units.js -svgedit.units.init(); -var unit_types = svgedit.units.typeMap; +svgedit.units.init(curConfig); +var unit_types = svgedit.units.getTypeMap(); + // import from svgutils.js var getUrlFromAttr = this.getUrlFromAttr = svgedit.utilities.getUrlFromAttr; @@ -129,7 +140,7 @@ svgedit.utilities.snapToGrid = function(value){ var stepSize = curConfig.snappingStep; var unit = curConfig.baseUnit; if(unit !== "px") { - stepSize *= svgedit.units.typeMap[unit]; + stepSize *= svgedit.units.typeMap[unit]; } value = Math.round(value/stepSize)*stepSize; return value; @@ -219,21 +230,10 @@ var isOpera = svgedit.browsersupport.isOpera, "exportNoforeignObject": "foreignObject elements will not appear", "exportNoDashArray": "Strokes will appear filled", "exportNoText": "Text may not appear as expected" - }, - - // Default configuration options - curConfig = { - show_outside_canvas: true, - dimensions: [640, 480] }; - - var visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use'; - var ref_attrs = ["clip-path", "fill", "filter", "marker-end", "marker-mid", "marker-start", "mask", "stroke"]; - -// Update config with new one if given -if(config) { - $.extend(curConfig, config); -} + +var visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use'; +var ref_attrs = ["clip-path", "fill", "filter", "marker-end", "marker-mid", "marker-start", "mask", "stroke"]; var elData = $.data; @@ -339,10 +339,12 @@ $(opac_ani).attr({ // Group: Unit conversion functions +// TODO(codedread): Migrate this into units.js // Set the scope for these functions -var convertToNum, convertToUnit, setUnitAttr, unitConvertAttrs; +var convertToNum, unitConvertAttrs; (function() { + // TODO(codedread): Remove these arrays and maps, they are now in units.js. var w_attrs = ['x', 'x1', 'cx', 'rx', 'width']; var h_attrs = ['y', 'y1', 'cy', 'ry', 'height']; var unit_attrs = $.merge(['r','radius'], w_attrs); @@ -391,49 +393,6 @@ var convertToNum, convertToUnit, setUnitAttr, unitConvertAttrs; return num * unit_types[unit]; } }; - - - // Function: setUnitAttr - // Sets an element's attribute based on the unit in its current value. - // - // Parameters: - // elem - DOM element to be changed - // attr - String with the name of the attribute associated with the value - // val - String with the attribute value to convert - setUnitAttr = function(elem, attr, val) { - if(!isNaN(val)) { - // New value is a number, so check currently used unit - var old_val = elem.getAttribute(attr); - - // Enable this for alternate mode -// if(old_val !== null && (isNaN(old_val) || curConfig.baseUnit !== 'px')) { -// // Old value was a number, so get unit, then convert -// var unit; -// if(old_val.substr(-1) === '%') { -// var res = getResolution(); -// unit = '%'; -// val *= 100; -// if(w_attrs.indexOf(attr) >= 0) { -// val = val / res.w; -// } else if(h_attrs.indexOf(attr) >= 0) { -// val = val / res.h; -// } else { -// return val / Math.sqrt((res.w*res.w) + (res.h*res.h))/Math.sqrt(2); -// } -// } else { -// if(curConfig.baseUnit !== 'px') { -// unit = curConfig.baseUnit; -// } else { -// unit = old_val.substr(-2); -// } -// val = val / unit_types[unit]; -// } -// -// val += unit; -// } - } - elem.setAttribute(attr, val); - }; // Function: isValidUnit // Check if an attribute's value is in a valid format @@ -475,22 +434,6 @@ var convertToNum, convertToUnit, setUnitAttr, unitConvertAttrs; return valid; }; - // Function: getUnits - // Returns the unit object with values for each unit - canvas.getUnits = function() { - return unit_types; - }; - - // Function: convertUnit - // Converts the number to given unit or baseUnit - canvas.convertUnit = function(val, unit) { - unit = unit || curConfig.baseUnit; -// baseVal.convertToSpecifiedUnits(unitNumMap[unit]); -// var val = baseVal.valueInSpecifiedUnits; -// baseVal.convertToSpecifiedUnits(1); - return shortFloat(val / unit_types[unit]); - }; - // Function: unitConvertAttrs // Converts all applicable attributes to the given baseUnit unitConvertAttrs = canvas.unitConvertAttrs = function(element) { @@ -1450,7 +1393,7 @@ var SelectorManager; // node - DOM element to apply new attribute values to // attrs - Object with attribute keys/values // suspendLength - Optional integer of milliseconds to suspend redraw -// unitCheck - Boolean to indicate the need to use setUnitAttr +// unitCheck - Boolean to indicate the need to use svgedit.units.setUnitAttr var assignAttributes = this.assignAttributes = function(node, attrs, suspendLength, unitCheck) { if(!suspendLength) suspendLength = 0; // Opera has a problem with suspendRedraw() apparently @@ -1466,7 +1409,7 @@ var assignAttributes = this.assignAttributes = function(node, attrs, suspendLeng } else if(!unitCheck) { node.setAttribute(i, attrs[i]); } else { - setUnitAttr(node, i, attrs[i]); + svgedit.units.setUnitAttr(node, i, attrs[i]); } } @@ -1730,6 +1673,10 @@ var shortFloat = function(val) { return parseFloat(val).toFixed(digits) - 0; } } + +this.convertUnit = function(val, unit) { + return shortFloat(svgedit.units.convertUnit(val, unit)); +}; // This method rounds the incoming value to the nearest value based on the current_zoom var round = this.round = function(val) { @@ -7313,8 +7260,8 @@ var svgToString = this.svgToString = function(elem, indent) { // } if(unit !== "px") { - res.w = canvas.convertUnit(res.w, unit) + unit; - res.h = canvas.convertUnit(res.h, unit) + unit; + res.w = shortFloat(svgedit.units.convertUnit(res.w, unit)) + unit; + res.h = shortFloat(svgedit.units.convertUnit(res.h, unit)) + unit; } out.push(' width="' + res.w + '" height="' + res.h + '"' + vb + ' xmlns="'+svgns+'"'); diff --git a/editor/units.js b/editor/units.js index 174d99fe..e0d4cbb1 100644 --- a/editor/units.js +++ b/editor/units.js @@ -38,15 +38,24 @@ var unitNumMap = { $.merge(unit_attrs, h_attrs); +// Read-only copy of configuration options. +svgedit.units.config_; + /** * Stores mapping of unit type to user coordinates. */ -svgedit.units.typeMap = {px: 1}; +svgedit.units.typeMap_ = {px: 1}; /** + * Function: svgedit.units.init() * Initializes this module. + * + * Parameters: + * config - an object containing configuration options. */ -svgedit.units.init = function() { +svgedit.units.init = function(config) { + svgedit.units.config_ = config; + var svgns = 'http://www.w3.org/2000/svg'; // Get correct em/ex values by creating a temporary SVG. @@ -61,14 +70,72 @@ svgedit.units.init = function() { document.body.removeChild(svg); var inch = bb.x; - svgedit.units.typeMap['em'] = bb.width; - svgedit.units.typeMap['ex'] = bb.height; - svgedit.units.typeMap['in'] = inch; - svgedit.units.typeMap['cm'] = inch / 2.54; - svgedit.units.typeMap['mm'] = inch / 25.4; - svgedit.units.typeMap['pt'] = inch / 72; - svgedit.units.typeMap['pc'] = inch / 6; - svgedit.units.typeMap['%'] = 0; + svgedit.units.typeMap_['em'] = bb.width; + svgedit.units.typeMap_['ex'] = bb.height; + svgedit.units.typeMap_['in'] = inch; + svgedit.units.typeMap_['cm'] = inch / 2.54; + svgedit.units.typeMap_['mm'] = inch / 25.4; + svgedit.units.typeMap_['pt'] = inch / 72; + svgedit.units.typeMap_['pc'] = inch / 6; + svgedit.units.typeMap_['%'] = 0; +}; + +// Function: svgedit.units.getTypeMap +// Returns the unit object with values for each unit +svgedit.units.getTypeMap = function() { + return svgedit.units.typeMap_; +}; + +// Function: svgedit.units.convertUnit +// Converts the number to given unit or baseUnit +svgedit.units.convertUnit = function(val, unit) { + unit = unit || svgedit.units.config_.baseUnit; +// baseVal.convertToSpecifiedUnits(unitNumMap[unit]); +// var val = baseVal.valueInSpecifiedUnits; +// baseVal.convertToSpecifiedUnits(1); + return val / svgedit.units.typeMap_[unit]; +}; + +// Function: svgedit.units.setUnitAttr +// Sets an element's attribute based on the unit in its current value. +// +// Parameters: +// elem - DOM element to be changed +// attr - String with the name of the attribute associated with the value +// val - String with the attribute value to convert +svgedit.units.setUnitAttr = function(elem, attr, val) { + if(!isNaN(val)) { + // New value is a number, so check currently used unit + var old_val = elem.getAttribute(attr); + + // Enable this for alternate mode +// if(old_val !== null && (isNaN(old_val) || curConfig.baseUnit !== 'px')) { +// // Old value was a number, so get unit, then convert +// var unit; +// if(old_val.substr(-1) === '%') { +// var res = getResolution(); +// unit = '%'; +// val *= 100; +// if(w_attrs.indexOf(attr) >= 0) { +// val = val / res.w; +// } else if(h_attrs.indexOf(attr) >= 0) { +// val = val / res.h; +// } else { +// return val / Math.sqrt((res.w*res.w) + (res.h*res.h))/Math.sqrt(2); +// } +// } else { +// if(curConfig.baseUnit !== 'px') { +// unit = svgedit.units.config_.baseUnit; +// } else { +// unit = old_val.substr(-2); +// } +// val = val / svgedit.units.typeMap_[unit]; +// } +// +// val += unit; +// } + } + elem.setAttribute(attr, val); }; })(); \ No newline at end of file