diff --git a/Makefile b/Makefile index e32fd343..b07ef2c8 100644 --- a/Makefile +++ b/Makefile @@ -17,14 +17,29 @@ build/$(PACKAGE): -find build/$(PACKAGE) -name .svn -type d -exec rm -rf {} \; # minify spin button java -jar $(YUICOMPRESS) build/$(PACKAGE)/spinbtn/JQuerySpinBtn.js > build/$(PACKAGE)/spinbtn/JQuerySpinBtn.min.js -# java -jar $(CLOSURE) --js build/$(PACKAGE)/spinbtn/JQuerySpinBtn.js --js_output_file build/$(PACKAGE)/spinbtn/JQuerySpinBtn.min-closure.js # minify SVG-edit files java -jar $(YUICOMPRESS) build/$(PACKAGE)/svgutils.js > build/$(PACKAGE)/svgutils.min.js java -jar $(YUICOMPRESS) build/$(PACKAGE)/browsersupport.js > build/$(PACKAGE)/browsersupport.min.js + java -jar $(YUICOMPRESS) build/$(PACKAGE)/svgtransformlist.js > build/$(PACKAGE)/svgtransformlist.min.js + java -jar $(YUICOMPRESS) build/$(PACKAGE)/math.js > build/$(PACKAGE)/math.min.js java -jar $(YUICOMPRESS) build/$(PACKAGE)/svg-editor.js > build/$(PACKAGE)/svg-editor.min.js -# java -jar $(CLOSURE) --js build/$(PACKAGE)/svg-editor.js --js_output_file build/$(PACKAGE)/svg-editor.min-closure.js java -jar $(YUICOMPRESS) build/$(PACKAGE)/svgcanvas.js > build/$(PACKAGE)/svgcanvas.min.js -# java -jar $(CLOSURE) --js build/$(PACKAGE)/svgcanvas.js --js_output_file build/$(PACKAGE)/svgcanvas.min-closure.js + +# codedread: This is how to compile everything into one big JS file. This +# would replace the 7 lines above. Seems to work for me but +# leaving compiled out for now for additional testing. +# NOTE: Some files are not ready for the Closure compiler: +# jquery, jgraduate. +# java -jar $(CLOSURE) \ +# --js browsersupport.js \ +# --js svgtransformlist.js \ +# --js math.js \ +# --js svgutils.js \ +# --js svgcanvas.js \ +# --js svg-editor.js \ +# --js locale/locale.js \ +# --js_output_file svgedit.compiled.js + # CSS files do not work remotely # java -jar $(YUICOMPRESS) build/$(PACKAGE)/spinbtn/JQuerySpinBtn.css > build/$(PACKAGE)/spinbtn/JQuerySpinBtn.min.css # java -jar $(YUICOMPRESS) build/$(PACKAGE)/svg-editor.css > build/$(PACKAGE)/svg-editor.min.css diff --git a/build/tools/COPYING b/build/tools/COPYING new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/build/tools/COPYING @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/build/tools/README b/build/tools/README new file mode 100644 index 00000000..d3c90e78 --- /dev/null +++ b/build/tools/README @@ -0,0 +1,289 @@ +/* + * Copyright 2009 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// +// Contents +// + +The Closure Compiler performs checking, instrumentation, and +optimizations on JavaScript code. The purpose of this README is to +explain how to build and run the Closure Compiler. + +The Closure Compiler requires Java 6 or higher. +http://www.java.com/ + + +// +// Building The Closure Compiler +// + +There are three ways to get a Closure Compiler executable. + +1) Use one we built for you. + +Pre-built Closure binaries can be found at +http://code.google.com/p/closure-compiler/downloads/list + + +2) Check out the source and build it with Apache Ant. + +First, check out the full source tree of the Closure Compiler. There +are instructions on how to do this at the project site. +http://code.google.com/p/closure-compiler/source/checkout + +Apache Ant is a cross-platform build tool. +http://ant.apache.org/ + +At the root of the source tree, there is an Ant file named +build.xml. To use it, navigate to the same directory and type the +command + +ant jar + +This will produce a jar file called "build/compiler.jar". + + +3) Check out the source and build it with Eclipse. + +Eclipse is a cross-platform IDE. +http://www.eclipse.org/ + +Under Eclipse's File menu, click "New > Project ..." and create a +"Java Project." You will see an options screen. Give the project a +name, select "Create project from existing source," and choose the +root of the checked-out source tree as the existing directory. Verify +that you are using JRE version 6 or higher. + +Eclipse can use the build.xml file to discover rules. When you +navigate to the build.xml file, you will see all the build rules in +the "Outline" pane. Run the "jar" rule to build the compiler in +build/compiler.jar. + + +// +// Running The Closure Compiler +// + +Once you have the jar binary, running the Closure Compiler is straightforward. + +On the command line, type + +java -jar compiler.jar + +This starts the compiler in interactive mode. Type + +var x = 17 + 25; + +then hit "Enter", then hit "Ctrl-Z" (on Windows) or "Ctrl-D" (on Mac or Linux) +and "Enter" again. The Compiler will respond: + +var x=42; + +The Closure Compiler has many options for reading input from a file, +writing output to a file, checking your code, and running +optimizations. To learn more, type + +java -jar compiler.jar --help + +You can read more detailed documentation about the many flags at +http://code.google.com/closure/compiler/docs/gettingstarted_app.html + + +// +// Compiling Multiple Scripts +// + +If you have multiple scripts, you should compile them all together with +one compile command. + +java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js + +The Closure Compiler will concatenate the files in the order they're +passed at the command line. + +If you need to compile many, many scripts together, you may start to +run into problems with managing dependencies between scripts. You +should check out the Closure Library. It contains functions for +enforcing dependencies between scripts, and a tool called calcdeps.py +that knows how to give scripts to the Closure Compiler in the right +order. + +http://code.google.com/p/closure-library/ + +// +// Licensing +// + +Unless otherwise stated, all source files are licensed under +the Apache License, Version 2.0. + + +----- +Code under: +src/com/google/javascript/rhino +test/com/google/javascript/rhino + +URL: http://www.mozilla.org/rhino +Version: 1.5R3, with heavy modifications +License: Netscape Public License and MPL / GPL dual license + +Description: A partial copy of Mozilla Rhino. Mozilla Rhino is an +implementation of JavaScript for the JVM. The JavaScript parser and +the parse tree data structures were extracted and modified +significantly for use by Google's JavaScript compiler. + +Local Modifications: The packages have been renamespaced. All code not +relavant to parsing has been removed. A JSDoc parser and static typing +system have been added. + + +----- +Code in: +lib/libtrunk_rhino_parser_jarjared.jar + +Rhino +URL: http://www.mozilla.org/rhino +Version: Trunk +License: Netscape Public License and MPL / GPL dual license + +Description: Mozilla Rhino is an implementation of JavaScript for the JVM. + +Local Modifications: None. We've used JarJar to renamespace the code +post-compilation. See: +http://code.google.com/p/jarjar/ + + +----- +Code in: +lib/args4j_deploy.jar + +Args4j +URL: https://args4j.dev.java.net/ +Version: 2.0.9 +License: MIT + +Description: +args4j is a small Java class library that makes it easy to parse command line +options/arguments in your CUI application. + +Local Modifications: None. + + +----- +Code in: +lib/guava-r06.jar + +Guava Libraries +URL: http://code.google.com/p/guava-libraries/ +Version: R6 +License: Apache License 2.0 + +Description: Google's core Java libraries. + +Local Modifications: None. + + +----- +Code in: +lib/hamcrest-core-1.1.jar + +Hamcrest +URL: http://code.google.com/p/hamcrest +License: BSD +License File: LICENSE + +Description: +Provides a library of matcher objects (also known as constraints or +predicates) allowing 'match' rules to be defined declaratively, to be used in +other frameworks. Typical scenarios include testing frameworks, mocking +libraries and UI validation rules. + +Local modifications: +The original jars contained both source code and compiled classes. + +hamcrest-core-1.1.jar just contains the compiled classes. + + + +----- +Code in: +lib/jsr305.jar + +Annotations for software defect detection +URL: http://code.google.com/p/jsr-305/ +Version: svn revision 47 +License: BSD License + +Description: Annotations for software defect detection. + +Local Modifications: None. + + +---- +Code in: +lib/junit.jar + +JUnit +URL: http://sourceforge.net/projects/junit/ +Version: 4.5 +License: Common Public License 1.0 + +Description: A framework for writing and running automated tests in Java. + +Local Modifications: None. + + +--- +Code in: +lib/protobuf-java-2.3.0.jar + +Protocol Buffers +URL: http://code.google.com/p/protobuf/ +Version: 2.3.0 +License: New BSD License + +Description: Supporting libraries for protocol buffers, +an encoding of structured data. + +Local Modifications: None + + +--- +Code in: +lib/ant_deploy.jar + +URL: http://ant.apache.org/bindownload.cgi +Version: 1.6.5 +License: Apache License 2.0 +Description: + Ant is a Java based build tool. In theory it is kind of like "make" + without make's wrinkles and with the full portability of pure java code. + +Local Modifications: + Modified apache-ant-1.6.5/bin/ant to look in the ant.runfiles directory + + +--- +Code in: +lib/json.jar +URL: http://json.org/java/index.html +Version: JSON version 2 +License: MIT license +Description: +JSON is a set of java files for use in transmitting data in JSON format. + +Local Modifications: None + diff --git a/build/tools/closure-compiler.jar b/build/tools/closure-compiler.jar index 7374f2d3..4dfa5ad0 100644 Binary files a/build/tools/closure-compiler.jar and b/build/tools/closure-compiler.jar differ diff --git a/editor/math.js b/editor/math.js new file mode 100644 index 00000000..0b5806b0 --- /dev/null +++ b/editor/math.js @@ -0,0 +1,187 @@ +/** + * SVG-edit Math Utilities + * + * Licensed under the Apache License, Version 2 + * + * Copyright(c) 2010 Alexis Deveria + * Copyright(c) 2010 Jeff Schiller + */ + +// Dependencies: +// None. + +(function() { + +if (!window.svgedit) { + window.svgedit = {}; +} + +if (!svgedit.math) { + svgedit.math = {}; +} + +// Constants +var NEAR_ZERO = 1e-14; + +// Throw away SVGSVGElement used for creating matrices/transforms. +var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + +// Function: svgedit.math.transformPoint +// A (hopefully) quicker function to transform a point by a matrix +// (this function avoids any DOM calls and just does the math) +// +// Parameters: +// x - Float representing the x coordinate +// y - Float representing the y coordinate +// m - Matrix object to transform the point with +// Returns a x,y object representing the transformed point +svgedit.math.transformPoint = function(x, y, m) { + return { x: m.a * x + m.c * y + m.e, y: m.b * x + m.d * y + m.f}; +}; + + +// Function: svgedit.math.isIdentity +// Helper function to check if the matrix performs no actual transform +// (i.e. exists for identity purposes) +// +// Parameters: +// m - The matrix object to check +// +// Returns: +// Boolean indicating whether or not the matrix is 1,0,0,1,0,0 +svgedit.math.isIdentity = function(m) { + return (m.a === 1 && m.b === 0 && m.c === 0 && m.d === 1 && m.e === 0 && m.f === 0); +}; + + +// Function: svgedit.math.matrixMultiply +// This function tries to return a SVGMatrix that is the multiplication m1*m2. +// We also round to zero when it's near zero +// +// Parameters: +// >= 2 Matrix objects to multiply +// +// Returns: +// The matrix object resulting from the calculation +svgedit.math.matrixMultiply = function() { + var args = arguments, i = args.length, m = args[i-1]; + + while(i-- > 1) { + var m1 = args[i-1]; + m = m1.multiply(m); + } + if (Math.abs(m.a) < NEAR_ZERO) m.a = 0; + if (Math.abs(m.b) < NEAR_ZERO) m.b = 0; + if (Math.abs(m.c) < NEAR_ZERO) m.c = 0; + if (Math.abs(m.d) < NEAR_ZERO) m.d = 0; + if (Math.abs(m.e) < NEAR_ZERO) m.e = 0; + if (Math.abs(m.f) < NEAR_ZERO) m.f = 0; + + return m; +}; + +// Function: svgedit.math.hasMatrixTransform +// See if the given transformlist includes a non-indentity matrix transform +// +// Parameters: +// tlist - The transformlist to check +// +// Returns: +// Boolean on whether or not a matrix transform was found +svgedit.math.hasMatrixTransform = function(tlist) { + if(!tlist) return false; + var num = tlist.numberOfItems; + while (num--) { + var xform = tlist.getItem(num); + if (xform.type == 1 && !svgedit.math.isIdentity(xform.matrix)) return true; + } + return false; +}; + +// Function: svgedit.math.transformBox +// Transforms a rectangle based on the given matrix +// +// Parameters: +// l - Float with the box's left coordinate +// t - Float with the box's top coordinate +// w - Float with the box width +// h - Float with the box height +// m - Matrix object to transform the box by +// +// Returns: +// An object with the following values: +// * tl - The top left coordinate (x,y object) +// * tr - The top right coordinate (x,y object) +// * bl - The bottom left coordinate (x,y object) +// * br - The bottom right coordinate (x,y object) +// * aabox - Object with the following values: +// * Float with the axis-aligned x coordinate +// * Float with the axis-aligned y coordinate +// * Float with the axis-aligned width coordinate +// * Float with the axis-aligned height coordinate +svgedit.math.transformBox = function(l, t, w, h, m) { + var topleft = {x:l,y:t}, + topright = {x:(l+w),y:t}, + botright = {x:(l+w),y:(t+h)}, + botleft = {x:l,y:(t+h)}; + var transformPoint = svgedit.math.transformPoint; + topleft = transformPoint( topleft.x, topleft.y, m ); + var minx = topleft.x, + maxx = topleft.x, + miny = topleft.y, + maxy = topleft.y; + topright = transformPoint( topright.x, topright.y, m ); + minx = Math.min(minx, topright.x); + maxx = Math.max(maxx, topright.x); + miny = Math.min(miny, topright.y); + maxy = Math.max(maxy, topright.y); + botleft = transformPoint( botleft.x, botleft.y, m); + minx = Math.min(minx, botleft.x); + maxx = Math.max(maxx, botleft.x); + miny = Math.min(miny, botleft.y); + maxy = Math.max(maxy, botleft.y); + botright = transformPoint( botright.x, botright.y, m ); + minx = Math.min(minx, botright.x); + maxx = Math.max(maxx, botright.x); + miny = Math.min(miny, botright.y); + maxy = Math.max(maxy, botright.y); + + return {tl:topleft, tr:topright, bl:botleft, br:botright, + aabox: {x:minx, y:miny, width:(maxx-minx), height:(maxy-miny)} }; +}; + +// Function: svgedit.math.transformListToTransform +// This returns a single matrix Transform for a given Transform List +// (this is the equivalent of SVGTransformList.consolidate() but unlike +// that method, this one does not modify the actual SVGTransformList) +// This function is very liberal with its min,max arguments +// +// Parameters: +// tlist - The transformlist object +// min - Optional integer indicating start transform position +// max - Optional integer indicating end transform position +// +// Returns: +// A single matrix transform object +svgedit.math.transformListToTransform = function(tlist, min, max) { + if(tlist == null) { + // Or should tlist = null have been prevented before this? + return svg.createSVGTransformFromMatrix(svg.createSVGMatrix()); + } + var min = min == undefined ? 0 : min; + var max = max == undefined ? (tlist.numberOfItems-1) : max; + min = parseInt(min); + max = parseInt(max); + if (min > max) { var temp = max; max = min; min = temp; } + var m = svg.createSVGMatrix(); + for (var i = min; i <= max; ++i) { + // if our indices are out of range, just use a harmless identity matrix + var mtom = (i >= 0 && i < tlist.numberOfItems ? + tlist.getItem(i).matrix : + svg.createSVGMatrix()); + m = svgedit.math.matrixMultiply(m, mtom); + } + return svg.createSVGTransformFromMatrix(m); +}; + +})(); \ No newline at end of file diff --git a/editor/svg-editor.html b/editor/svg-editor.html index 25a39ad4..3bdcb746 100644 --- a/editor/svg-editor.html +++ b/editor/svg-editor.html @@ -20,6 +20,7 @@ + @@ -35,6 +36,7 @@ + diff --git a/editor/svg-editor.js b/editor/svg-editor.js index b1bdeccd..0fcffd4d 100644 --- a/editor/svg-editor.js +++ b/editor/svg-editor.js @@ -462,7 +462,7 @@ "#00007f", "#3f007f", "#7f007f", "#7f003f", "#ffaaaa", "#ffd4aa", "#ffffaa", "#d4ffaa", "#aaffaa", "#aaffd4", "#aaffff", "#aad4ff", - "#aaaaff", "#d4aaff", "#ffaaff", "#ffaad4", + "#aaaaff", "#d4aaff", "#ffaaff", "#ffaad4" ], isMac = (navigator.platform.indexOf("Mac") >= 0), isWebkit = (navigator.userAgent.indexOf("AppleWebKit") >= 0), @@ -2921,7 +2921,7 @@ "div#workarea": { 'left': 38, 'top': 74 - }, + } // "#tools_bottom": { // 'left': {s: '27px', l: '46px', xl: '65px'}, // 'height': {s: '58px', l: '98px', xl: '145px'} diff --git a/editor/svgcanvas.js b/editor/svgcanvas.js index c7157695..94478585 100644 --- a/editor/svgcanvas.js +++ b/editor/svgcanvas.js @@ -13,7 +13,8 @@ // 1) jQuery // 2) browsersupport.js // 3) svgtransformlist.js -// 4) svgutils.js +// 4) math.js +// 5) svgutils.js if(!window.console) { window.console = {}; @@ -3610,110 +3611,13 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { // Root Current Transformation Matrix in user units var root_sctm = null; -// Function: transformPoint -// A (hopefully) quicker function to transform a point by a matrix -// (this function avoids any DOM calls and just does the math) -// -// Parameters: -// x - Float representing the x coordinate -// y - Float representing the y coordinate -// m - Matrix object to transform the point with -// Returns a x,y object representing the transformed point -var transformPoint = function(x, y, m) { - return { x: m.a * x + m.c * y + m.e, y: m.b * x + m.d * y + m.f}; -}; - -// Function: isIdentity -// Helper function to check if the matrix performs no actual transform -// (i.e. exists for identity purposes) -// -// Parameters: -// m - The matrix object to check -// -// Returns: -// Boolean indicating whether or not the matrix is 1,0,0,1,0,0 -var isIdentity = function(m) { - return (m.a === 1 && m.b === 0 && m.c === 0 && m.d === 1 && m.e === 0 && m.f === 0); -} - -// Function: matrixMultiply -// This function tries to return a SVGMatrix that is the multiplication m1*m2. -// We also round to zero when it's near zero -// -// Parameters: -// >= 2 Matrix objects to multiply -// -// Returns: -// The matrix object resulting from the calculation -var matrixMultiply = this.matrixMultiply = function() { - var NEAR_ZERO = 1e-14, - args = arguments, i = args.length, m = args[i-1]; - - while(i-- > 1) { - var m1 = args[i-1]; - m = m1.multiply(m); - } - if (Math.abs(m.a) < NEAR_ZERO) m.a = 0; - if (Math.abs(m.b) < NEAR_ZERO) m.b = 0; - if (Math.abs(m.c) < NEAR_ZERO) m.c = 0; - if (Math.abs(m.d) < NEAR_ZERO) m.d = 0; - if (Math.abs(m.e) < NEAR_ZERO) m.e = 0; - if (Math.abs(m.f) < NEAR_ZERO) m.f = 0; - - return m; -} - -// Function: transformListToTransform -// This returns a single matrix Transform for a given Transform List -// (this is the equivalent of SVGTransformList.consolidate() but unlike -// that method, this one does not modify the actual SVGTransformList) -// This function is very liberal with its min,max arguments -// -// Parameters: -// tlist - The transformlist object -// min - Optional integer indicating start transform position -// max - Optional integer indicating end transform position -// -// Returns: -// A single matrix transform object -var transformListToTransform = this.transformListToTransform = function(tlist, min, max) { - if(tlist == null) { - // Or should tlist = null have been prevented before this? - return svgroot.createSVGTransformFromMatrix(svgroot.createSVGMatrix()); - } - var min = min == undefined ? 0 : min; - var max = max == undefined ? (tlist.numberOfItems-1) : max; - min = parseInt(min); - max = parseInt(max); - if (min > max) { var temp = max; max = min; min = temp; } - var m = svgroot.createSVGMatrix(); - for (var i = min; i <= max; ++i) { - // if our indices are out of range, just use a harmless identity matrix - var mtom = (i >= 0 && i < tlist.numberOfItems ? - tlist.getItem(i).matrix : - svgroot.createSVGMatrix()); - m = matrixMultiply(m, mtom); - } - return svgroot.createSVGTransformFromMatrix(m); -}; - -// Function: hasMatrixTransform -// See if the given transformlist includes a non-indentity matrix transform -// -// Parameters: -// tlist - The transformlist to check -// -// Returns: -// Boolean on whether or not a matrix transform was found -var hasMatrixTransform = this.hasMatrixTransform = function(tlist) { - if(!tlist) return false; - var num = tlist.numberOfItems; - while (num--) { - var xform = tlist.getItem(num); - if (xform.type == 1 && !isIdentity(xform.matrix)) return true; - } - return false; -} +// "Import" math.js. +var transformPoint = svgedit.math.transformPoint; +var isIdentity = svgedit.math.isIdentity; +var matrixMultiply = this.matrixMultiply = svgedit.math.matrixMultiply; +var hasMatrixTransform = this.hasMatrixTransform = svgedit.math.hasMatrixTransform; +var transformBox = this.transformBox = svgedit.math.transformBox; +var transformListToTransform = this.transformListToTransform = svgedit.math.transformListToTransform; // Function: getMatrix // Get the matrix object for a given element @@ -3728,58 +3632,6 @@ var getMatrix = function(elem) { return transformListToTransform(tlist).matrix; } -// Function: transformBox -// Transforms a rectangle based on the given matrix -// -// Parameters: -// l - Float with the box's left coordinate -// t - Float with the box's top coordinate -// w - Float with the box width -// h - Float with the box height -// m - Matrix object to transform the box by -// -// Returns: -// An object with the following values: -// * tl - The top left coordinate (x,y object) -// * tr - The top right coordinate (x,y object) -// * bl - The bottom left coordinate (x,y object) -// * br - The bottom right coordinate (x,y object) -// * aabox - Object with the following values: -// * Float with the axis-aligned x coordinate -// * Float with the axis-aligned y coordinate -// * Float with the axis-aligned width coordinate -// * Float with the axis-aligned height coordinate -var transformBox = this.transformBox = function(l, t, w, h, m) { - var topleft = {x:l,y:t}, - topright = {x:(l+w),y:t}, - botright = {x:(l+w),y:(t+h)}, - botleft = {x:l,y:(t+h)}; - topleft = transformPoint( topleft.x, topleft.y, m ); - var minx = topleft.x, - maxx = topleft.x, - miny = topleft.y, - maxy = topleft.y; - topright = transformPoint( topright.x, topright.y, m ); - minx = Math.min(minx, topright.x); - maxx = Math.max(maxx, topright.x); - miny = Math.min(miny, topright.y); - maxy = Math.max(maxy, topright.y); - botleft = transformPoint( botleft.x, botleft.y, m); - minx = Math.min(minx, botleft.x); - maxx = Math.max(maxx, botleft.x); - miny = Math.min(miny, botleft.y); - maxy = Math.max(maxy, botleft.y); - botright = transformPoint( botright.x, botright.y, m ); - minx = Math.min(minx, botright.x); - maxx = Math.max(maxx, botright.x); - miny = Math.min(miny, botright.y); - maxy = Math.max(maxy, botright.y); - - return {tl:topleft, tr:topright, bl:botleft, br:botright, - aabox: {x:minx, y:miny, width:(maxx-minx), height:(maxy-miny)} }; -}; - - // Group: Selection // Function: clearSelection @@ -4018,8 +3870,6 @@ var getMouseTarget = this.getMouseTarget = function(evt) { while (mouse_target.parentNode !== (current_group || current_layer)) { mouse_target = mouse_target.parentNode; } - return mouse_target; - // // // go up until we hit a child of a layer @@ -6602,8 +6452,7 @@ var pathActions = this.pathActions = function() { "attr": { "d": d_attr, "id": getNextId(), - "opacity": cur_shape.opacity / 2, - + "opacity": cur_shape.opacity / 2 } }); // set stretchy line to first point @@ -8447,7 +8296,6 @@ this.importSvgString = function(xmlString) { recalculateDimensions(use_el); $(use_el).data('symbol', symbol); addToSelection([use_el]); - return true; // TODO: Find way to add this in a recalculateDimensions-parsable way // if (vb[0] != 0 || vb[1] != 0) @@ -9766,7 +9614,7 @@ this.getBlur = function(elem) { x: '-50%', y: '-50%', width: '200%', - height: '200%', + height: '200%' }, 100); } else { // Removing these attributes hides text in Chrome (see Issue 579) @@ -10271,6 +10119,7 @@ var changeSelectedAttributeNoUndo = function(attr, newValue, elems) { } // only allow the transform/opacity/filter attribute to change on elements, slightly hacky + // TODO: FIXME: This doesn't seem right. Where's the body of this if statement? if (elem.tagName === "g" && good_g_attrs.indexOf(attr) >= 0); var oldval = attr === "#text" ? elem.textContent : elem.getAttribute(attr); if (oldval == null) oldval = "";