|
780 | 780 | if (arguments[0] === "evenodd" || arguments[1] === "evenodd") { |
781 | 781 | element.setAttribute("fill-rule", "evenodd"); |
782 | 782 | } |
783 | | - |
784 | | - this.__applyStyleToCurrentElement("fill"); |
785 | | - this.__applyTransform(element, "fill"); |
786 | 783 | }; |
787 | 784 |
|
788 | 785 | /** |
789 | 786 | * Sets the stroke property on the current element |
790 | 787 | */ |
791 | 788 | ctx.prototype.stroke = function () { |
792 | 789 | var element = getOrCreateElementToApplyStyleTo.call(this, "stroke", "fill"); |
793 | | - |
794 | | - this.__applyStyleToCurrentElement("stroke"); |
795 | | - this.__applyTransform(element, "stroke"); |
796 | 790 | }; |
797 | 791 |
|
798 | 792 | function getOrCreateElementToApplyStyleTo(paint1, paint2) { |
799 | 793 | var element = this.__currentElement; |
800 | 794 | var matrixString = this.__currentMatrix.toString(); |
801 | 795 |
|
802 | | - var currentPath = this.__currentDefaultPath; |
| 796 | + var currentPath = this.__currentDefaultPath; |
803 | 797 | var group = this.__closestGroupOrSvg(); |
804 | 798 | var extras = group.__extras || (group.__extras = {}) |
805 | 799 |
|
806 | | - var isPath = element.nodeName === "path"; |
807 | | - if (extras[paint1] || extras[paint2] && extras.matrixString !== matrixString) { |
| 800 | + var isPath = element.nodeName === "path"; |
| 801 | + if (extras[paint1] || extras[paint2] && extras.matrixString !== matrixString) { |
808 | 802 | var pathHasNotChanged = currentPath === extras.currentPath; |
809 | 803 | if (pathHasNotChanged) { |
810 | 804 | if (isPath) { |
|
826 | 820 | extras.currentPath = currentPath; |
827 | 821 | extras.matrixString = matrixString; |
828 | 822 |
|
| 823 | + this.__applyStyleToCurrentElement(paint1); |
| 824 | + this.__applyTransform(element, paint1); |
| 825 | + |
829 | 826 | return element; |
830 | 827 | }; |
831 | 828 |
|
| 829 | + function hashString(string) { |
| 830 | + /** https://github.com/darkskyapp/string-hash **/ |
| 831 | + let hash = 5381; |
| 832 | + let i = string.length; |
| 833 | + while (i) hash = (hash * 33) ^ string.charCodeAt(--i); |
| 834 | + return hash >>> 0; |
| 835 | + }; |
| 836 | + |
832 | 837 | function convertPathToDef(group, id) { |
833 | 838 | var element = this.__currentElement; |
834 | 839 |
|
835 | | - /** Create <path> <def> **/ |
836 | | - var id = group.__extras.id = randomString(this.__ids); |
837 | | - var link = this.__createElement("path"); |
838 | | - link.setAttribute("id", id); |
839 | | - link.setAttribute("d", element.getAttribute("d")); |
840 | | - this.__defs.appendChild(link); |
| 840 | + /** Create <path> in <defs> **/ |
| 841 | + var extras = group.__extras |
| 842 | + var id = extras.id |
| 843 | + if (!id) { |
| 844 | + id = `path-${hashString(extras.currentPath)}`; |
| 845 | + var link = this.__createElement("path"); |
| 846 | + link.setAttribute("id", id); |
| 847 | + link.setAttribute("d", element.getAttribute("d")); |
| 848 | + this.__defs.appendChild(link); |
| 849 | + } |
841 | 850 |
|
842 | 851 | /** Convert previous <path> to <use> **/ |
843 | 852 | if (element.nodeName === "path") { |
|
0 commit comments