-
Notifications
You must be signed in to change notification settings - Fork 20
/
svgWriterStroke.js
102 lines (89 loc) · 4.46 KB
/
svgWriterStroke.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright (c) 2014, 2015 Adobe Systems Incorporated. All rights reserved.
//
// 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.
/*jslint vars: true, plusplus: true, devel: true, nomen: true, indent: 4, bitwise: true */
/*global define: true, require: true */
/* Help write the SVG */
(function () {
"use strict";
var svgWriterUtils = require("./svgWriterUtils.js"),
svgWriterGradient = require("./svgWriterGradient.js");
var write = svgWriterUtils.write,
writeRadialGradient = svgWriterGradient.writeRadialGradient,
writeLinearGradient = svgWriterGradient.writeLinearGradient,
writeColor = svgWriterUtils.writeColor,
px = svgWriterUtils.px;
function SVGWriterStroke() {
this.hasStroke = function (ctx) {
var omIn = ctx.currentOMNode;
return omIn.style && omIn.style.stroke && omIn.style.stroke.type != "none";
};
this.scanForUnsupportedFeatures = function (ctx) {
};
this.externalizeStyles = function (ctx) {
var omIn = ctx.currentOMNode,
styleBlock;
if (this.hasStroke(ctx)) {
var stroke = omIn.style.stroke;
// Make a style for this stroke and reference it.
styleBlock = ctx.omStylesheet.getStyleBlock(omIn);
if (stroke.type == "gradient") {
var gradientID;
if (stroke.gradient.type === "linear") {
gradientID = writeLinearGradient(ctx, stroke.gradient, "-stroke");
} else if (stroke.gradient.type === "radial") {
gradientID = writeRadialGradient(ctx, stroke.gradient, "-stroke");
}
if (gradientID) {
styleBlock.addRule("stroke", "url(#" + gradientID + ")");
}
} else {
styleBlock.addRule("stroke", svgWriterUtils.writeColor(omIn.style.stroke.color));
}
if (omIn.style.stroke.lineCap !== "butt") {
styleBlock.addRule("stroke-linecap", omIn.style.stroke.lineCap);
}
if (omIn.style.stroke.lineJoin !== "miter") {
styleBlock.addRule("stroke-linejoin", omIn.style.stroke.lineJoin);
}
if (px(ctx, omIn.style.stroke.miterLimit) !== 100) {
styleBlock.addRule("stroke-miterlimit", px(ctx, omIn.style.stroke.miterLimit) + "px");
}
if (omIn.style.stroke.dashOffset) {
styleBlock.addRule("stroke-dashoffset", px(ctx, omIn.style.stroke.dashOffset) + "px");
}
if (omIn.style.stroke.opacity !== 1) {
styleBlock.addRule("stroke-opacity", omIn.style.stroke.opacity);
}
if (omIn.style.stroke.lineWidth) {
ctx._lastStrokeWidth = px(ctx, omIn.style.stroke.lineWidth);
styleBlock.addRule("stroke-width", ctx._lastStrokeWidth + "px");
}
if (omIn.style.stroke.dashArray && omIn.style.stroke.dashArray.length) {
var width = px(ctx, omIn.style.stroke.lineWidth) ? px(ctx, omIn.style.stroke.lineWidth) : 0;
var dashArray = omIn.style.stroke.dashArray.map(function(element, index) {
if (element && element.hasOwnProperty("value")) {
element = px(element);
}
// This is a work around for a bug in Chrome on [0,2] dash arrays.
if (!index && !element)
return 0.001;
return width * element;
}).join();
styleBlock.addRule("stroke-dasharray", dashArray);
}
}
};
}
module.exports = new SVGWriterStroke();
}());