mirror of
https://github.com/niklasvh/html2canvas.git
synced 2023-08-10 21:13:10 +03:00
Correctly use native rendering with inline <svg> nodes if possible
This commit is contained in:
parent
bc08edc340
commit
c1ea1206e3
14
dist/html2canvas.js
vendored
14
dist/html2canvas.js
vendored
@ -931,7 +931,7 @@ ImageLoader.prototype.loadImage = function(imageData) {
|
|||||||
} else if (imageData.method === "gradient") {
|
} else if (imageData.method === "gradient") {
|
||||||
return new WebkitGradientContainer(imageData);
|
return new WebkitGradientContainer(imageData);
|
||||||
} else if (imageData.method === "svg") {
|
} else if (imageData.method === "svg") {
|
||||||
return new SVGNodeContainer(imageData.args[0]);
|
return new SVGNodeContainer(imageData.args[0], this.support.svg);
|
||||||
} else if (imageData.method === "IFRAME") {
|
} else if (imageData.method === "IFRAME") {
|
||||||
return new FrameContainer(imageData.args[0], this.isSameOrigin(imageData.args[0].src), this.options.proxy);
|
return new FrameContainer(imageData.args[0], this.isSameOrigin(imageData.args[0].src), this.options.proxy);
|
||||||
} else {
|
} else {
|
||||||
@ -2498,12 +2498,20 @@ function decode64(base64) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
function SVGNodeContainer(node) {
|
function SVGNodeContainer(node, native) {
|
||||||
this.src = node;
|
this.src = node;
|
||||||
this.image = null;
|
this.image = null;
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
this.promise = this.hasFabric().then(function() {
|
this.promise = native ? new Promise(function(resolve, reject) {
|
||||||
|
self.image = new Image();
|
||||||
|
self.image.onload = resolve;
|
||||||
|
self.image.onerror = reject;
|
||||||
|
self.image.src = "data:image/svg+xml," + (new XMLSerializer()).serializeToString(node);
|
||||||
|
if (self.image.complete === true) {
|
||||||
|
resolve(self.image);
|
||||||
|
}
|
||||||
|
}) : this.hasFabric().then(function() {
|
||||||
return new Promise(function(resolve) {
|
return new Promise(function(resolve) {
|
||||||
html2canvas.fabric.parseSVGDocument(node, self.createCanvas.call(self, resolve));
|
html2canvas.fabric.parseSVGDocument(node, self.createCanvas.call(self, resolve));
|
||||||
});
|
});
|
||||||
|
4
dist/html2canvas.min.js
vendored
4
dist/html2canvas.min.js
vendored
File diff suppressed because one or more lines are too long
@ -67,7 +67,7 @@ ImageLoader.prototype.loadImage = function(imageData) {
|
|||||||
} else if (imageData.method === "gradient") {
|
} else if (imageData.method === "gradient") {
|
||||||
return new WebkitGradientContainer(imageData);
|
return new WebkitGradientContainer(imageData);
|
||||||
} else if (imageData.method === "svg") {
|
} else if (imageData.method === "svg") {
|
||||||
return new SVGNodeContainer(imageData.args[0]);
|
return new SVGNodeContainer(imageData.args[0], this.support.svg);
|
||||||
} else if (imageData.method === "IFRAME") {
|
} else if (imageData.method === "IFRAME") {
|
||||||
return new FrameContainer(imageData.args[0], this.isSameOrigin(imageData.args[0].src), this.options.proxy);
|
return new FrameContainer(imageData.args[0], this.isSameOrigin(imageData.args[0].src), this.options.proxy);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,9 +1,17 @@
|
|||||||
function SVGNodeContainer(node) {
|
function SVGNodeContainer(node, native) {
|
||||||
this.src = node;
|
this.src = node;
|
||||||
this.image = null;
|
this.image = null;
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
this.promise = this.hasFabric().then(function() {
|
this.promise = native ? new Promise(function(resolve, reject) {
|
||||||
|
self.image = new Image();
|
||||||
|
self.image.onload = resolve;
|
||||||
|
self.image.onerror = reject;
|
||||||
|
self.image.src = "data:image/svg+xml," + (new XMLSerializer()).serializeToString(node);
|
||||||
|
if (self.image.complete === true) {
|
||||||
|
resolve(self.image);
|
||||||
|
}
|
||||||
|
}) : this.hasFabric().then(function() {
|
||||||
return new Promise(function(resolve) {
|
return new Promise(function(resolve) {
|
||||||
html2canvas.fabric.parseSVGDocument(node, self.createCanvas.call(self, resolve));
|
html2canvas.fabric.parseSVGDocument(node, self.createCanvas.call(self, resolve));
|
||||||
});
|
});
|
||||||
|
25
tests/cases/images/svg/native_only.html
Normal file
25
tests/cases/images/svg/native_only.html
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Native svg only</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<script>
|
||||||
|
var noFabric = true;
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript" src="../../../test.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
<img src="../../../assets/image.svg" />
|
||||||
|
<img width="200" height="200" src='data:image/svg+xml,<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="306" height="296"><defs id="defs4" /><g transform="translate(-162.46995,-477.2863)" id="layer1"><path d="m 314.15745,481.69558 c -59.20089,0.53774 -114.80979,36.72219 -137.3125,95.34375 -29.39129,76.56693 8.83932,162.45246 85.40625,191.84375 l 34.03125,-88.6875 c -20.0678,-7.71358 -34.3125,-27.15324 -34.3125,-49.9375 0,-29.54723 23.95277,-53.5 53.5,-53.5 29.54723,0 53.5,23.95277 53.5,53.5 0,22.78426 -14.2447,42.22392 -34.3125,49.9375 l 34.03125,88.6875 c 39.29085,-15.08234 70.3239,-46.1154 85.40625,-85.40625 29.39129,-76.56693 -8.83932,-162.48371 -85.40625,-191.875 -17.94537,-6.88859 -36.40853,-10.07087 -54.53125,-9.90625 z" id="path2830" style="fill:#40aa54;fill-opacity:1;stroke:#20552a;stroke-width:7.99999952;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></svg>' />
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="306" height="296" id="svg2">
|
||||||
|
<defs id="defs4"/>
|
||||||
|
<g transform="translate(-162.46995,-477.2863)" id="layer1">
|
||||||
|
<path d="m 314.15745,481.69558 c -59.20089,0.53774 -114.80979,36.72219 -137.3125,95.34375 -29.39129,76.56693 8.83932,162.45246 85.40625,191.84375 l 34.03125,-88.6875 c -20.0678,-7.71358 -34.3125,-27.15324 -34.3125,-49.9375 0,-29.54723 23.95277,-53.5 53.5,-53.5 29.54723,0 53.5,23.95277 53.5,53.5 0,22.78426 -14.2447,42.22392 -34.3125,49.9375 l 34.03125,88.6875 c 39.29085,-15.08234 70.3239,-46.1154 85.40625,-85.40625 29.39129,-76.56693 -8.83932,-162.48371 -85.40625,-191.875 -17.94537,-6.88859 -36.40853,-10.07087 -54.53125,-9.90625 z"
|
||||||
|
id="path2830"
|
||||||
|
style="fill:#40aa54;fill-opacity:1;stroke:#20552a;stroke-width:7.99999952;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
<img width="200" height="200" src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjMwNiIgaGVpZ2h0PSIyOTYiPjxkZWZzIGlkPSJkZWZzNCIgLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTYyLjQ2OTk1LC00NzcuMjg2MykiIGlkPSJsYXllcjEiPjxwYXRoIGQ9Im0gMzE0LjE1NzQ1LDQ4MS42OTU1OCBjIC01OS4yMDA4OSwwLjUzNzc0IC0xMTQuODA5NzksMzYuNzIyMTkgLTEzNy4zMTI1LDk1LjM0Mzc1IC0yOS4zOTEyOSw3Ni41NjY5MyA4LjgzOTMyLDE2Mi40NTI0NiA4NS40MDYyNSwxOTEuODQzNzUgbCAzNC4wMzEyNSwtODguNjg3NSBjIC0yMC4wNjc4LC03LjcxMzU4IC0zNC4zMTI1LC0yNy4xNTMyNCAtMzQuMzEyNSwtNDkuOTM3NSAwLC0yOS41NDcyMyAyMy45NTI3NywtNTMuNSA1My41LC01My41IDI5LjU0NzIzLDAgNTMuNSwyMy45NTI3NyA1My41LDUzLjUgMCwyMi43ODQyNiAtMTQuMjQ0Nyw0Mi4yMjM5MiAtMzQuMzEyNSw0OS45Mzc1IGwgMzQuMDMxMjUsODguNjg3NSBjIDM5LjI5MDg1LC0xNS4wODIzNCA3MC4zMjM5LC00Ni4xMTU0IDg1LjQwNjI1LC04NS40MDYyNSAyOS4zOTEyOSwtNzYuNTY2OTMgLTguODM5MzIsLTE2Mi40ODM3MSAtODUuNDA2MjUsLTE5MS44NzUgLTE3Ljk0NTM3LC02Ljg4ODU5IC0zNi40MDg1MywtMTAuMDcwODcgLTU0LjUzMTI1LC05LjkwNjI1IHoiIGlkPSJwYXRoMjgzMCIgc3R5bGU9ImZpbGw6IzQwYWE1NDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzIwNTUyYTtzdHJva2Utd2lkdGg6Ny45OTk5OTk1MjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPjwvZz48L3N2Zz4=" /></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -16,7 +16,9 @@ var h2cSelector, h2cOptions;
|
|||||||
|
|
||||||
['/tests/assets/jquery-1.6.2'].concat(window.location.search === "?selenium" ? ['/dist/html2canvas'] : sources.map(function(src) { return '/src/' + src; })).forEach(appendScript);
|
['/tests/assets/jquery-1.6.2'].concat(window.location.search === "?selenium" ? ['/dist/html2canvas'] : sources.map(function(src) { return '/src/' + src; })).forEach(appendScript);
|
||||||
|
|
||||||
|
if (typeof(noFabric) === "undefined") {
|
||||||
appendScript('/dist/html2canvas.svg');
|
appendScript('/dist/html2canvas.svg');
|
||||||
|
}
|
||||||
|
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
(function( $ ){
|
(function( $ ){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user