Skip to content

Commit 67231fb

Browse files
committed
Implemented linear and radial gradients for fill and stroke colors.
1 parent ec5b630 commit 67231fb

File tree

1 file changed

+66
-5
lines changed

1 file changed

+66
-5
lines changed

js/main.js

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ var lastFileName = "";
148148
var lastFileData;
149149
var warnings = [];
150150
var svgStyles = {};
151+
var gradients = {};
151152
var globalSvg;
152153

153154
var clipPathEnabled = false;
@@ -234,6 +235,10 @@ function recursiveTreeWalk(parent, groupLevel, clipPath) {
234235
}
235236

236237
function preprocessReferences(svg) {
238+
svg.find("defs").children().each(function () {
239+
var current = $(this);
240+
substituteUseRef(svg, current);
241+
});
237242
svg.find("use").each(function () {
238243
var current = $(this);
239244
substituteUseRef(svg, current);
@@ -529,16 +534,37 @@ function printPath(pathData, stylesArray, groupLevel, clipPath) {
529534
if (!clipPath) {
530535
generatedOutput += INDENT.repeat(groupLevel + 1) + '<path\n';
531536
if (toBool(localStorage.useIdAsName)) generatedOutput += generateAttr('name', styles["id"], groupLevel, "");
532-
generatedOutput += generateAttr('fillColor', parseColorToHex(styles["fill"]), groupLevel, "none");
537+
var gradientID = null;
538+
var gradientAttr = null;
539+
if ((typeof styles["fill"] !== "undefined") && styles["fill"].startsWith("url(")) {
540+
gradientID = styles["fill"].slice(5, -1);
541+
gradientAttr = "fillColor";
542+
} else {
543+
generatedOutput += generateAttr('fillColor', parseColorToHex(styles["fill"]), groupLevel, "none");
544+
}
533545
generatedOutput += generateAttr('fillAlpha', styles["fill-opacity"], groupLevel, "1");
534546
generatedOutput += generateAttr('fillType', styles["fill-rule"], groupLevel, "nonZero");
535-
generatedOutput += generateAttr('strokeColor', parseColorToHex(styles["stroke"]), groupLevel, "none");
547+
if ((typeof styles["stroke"] !== "undefined") && styles["stroke"].startsWith("url(")) {
548+
gradientID = styles["stroke"].slice(5, -1);
549+
gradientAttr = "strokeColor";
550+
} else {
551+
generatedOutput += generateAttr('strokeColor', parseColorToHex(styles["stroke"]), groupLevel, "none");
552+
}
536553
generatedOutput += generateAttr('strokeAlpha', styles["stroke-opacity"], groupLevel, "1");
537554
generatedOutput += generateAttr('strokeWidth', removeNonNumeric(styles["stroke-width"]), groupLevel, "0");
538555
generatedOutput += generateAttr('strokeLineJoin', styles["stroke-linejoin"], groupLevel, "miter");
539556
generatedOutput += generateAttr('strokeMiterLimit', styles["stroke-miterlimit"], groupLevel, "4");
540557
generatedOutput += generateAttr('strokeLineCap', styles["stroke-linecap"], groupLevel, "butt");
541-
generatedOutput += generateAttr('pathData', pathData, groupLevel, null, true);
558+
if (gradientID !== null) {
559+
generatedOutput += generateAttr('pathData', pathData, groupLevel, null);
560+
generatedOutput += '>\n';
561+
generatedOutput += INDENT.repeat(groupLevel + 2) + '<aapt:attr name="android:' + gradientAttr + '">\n';
562+
generatedOutput += gradients[gradientID] + '\n';
563+
generatedOutput += INDENT.repeat(groupLevel + 2) + '</aapt:attr>\n';
564+
generatedOutput += INDENT.repeat(groupLevel + 1) + '</path>\n';
565+
} else {
566+
generatedOutput += generateAttr('pathData', pathData, groupLevel, null, true);
567+
}
542568
pathsParsedCount++;
543569
} else {
544570
clipPathMerged.push(pathData);
@@ -550,6 +576,39 @@ function printPath(pathData, stylesArray, groupLevel, clipPath) {
550576
}
551577
}
552578

579+
function parseGradients(svg) {
580+
svg.find("defs").children().each(function () {
581+
var current = $(this);
582+
if (current.prop("tagName").endsWith("Gradient")) {
583+
var androidXML = '<gradient\n';
584+
androidXML += generateAttr('startX', current.attr("x1"), 1, "0");
585+
androidXML += generateAttr('startY', current.attr("y1"), 1, "0");
586+
androidXML += generateAttr('endX', current.attr("x2"), 1, "0");
587+
androidXML += generateAttr('endY', current.attr("y2"), 1, "0");
588+
if (current.prop("tagName").startsWith("linear")) {
589+
androidXML += INDENT.repeat(1) + 'android:type="linear">';
590+
} else if (current.prop("tagName").startsWith("radial")) {
591+
androidXML += INDENT.repeat(1) + 'android:type="radial">';
592+
}
593+
current.children().each(function () {
594+
var stopTag = $(this);
595+
androidXML += INDENT.repeat(2) + '<item\n';
596+
androidXML += generateAttr('offset', stopTag.attr("offset"), 3, null);
597+
if (typeof stopTag.attr("stop-opacity") !== "undefined") {
598+
var alpha = ("0" + Math.round(parseFloat(stopTag.attr("stop-opacity")) * 255).toString(16)).slice(-2)
599+
var color = parseColorToHex(stopTag.attr("stop-color")).slice(-6)
600+
601+
androidXML += generateAttr('color', "#"+alpha+color, 3, null, true);
602+
} else {
603+
androidXML += generateAttr('color', parseColorToHex(stopTag.attr("stop-color")), 3, null, true);
604+
}
605+
});
606+
androidXML += '</gradient>';
607+
gradients[current.attr("id")] = androidXML;
608+
}
609+
});
610+
}
611+
553612
function generateCode(inputXml) {
554613
var resultData = { error:null, warnings:null, code:null };
555614

@@ -569,7 +628,8 @@ function generateCode(inputXml) {
569628
var svg = xml.find("svg");
570629
globalSvg = svg;
571630
preprocessReferences(svg);
572-
631+
parseGradients(svg);
632+
573633
if (toBool(localStorage.bakeTransforms)) {
574634
try {
575635
flatten(svg[0], false, true);
@@ -593,6 +653,7 @@ function generateCode(inputXml) {
593653
//XML Vector start
594654
generatedOutput = '<?xml version="1.0" encoding="utf-8"?>\n';
595655
generatedOutput += '<vector xmlns:android="http://schemas.android.com/apk/res/android"';
656+
generatedOutput += '\n' + INDENT + 'xmlns:aapt="http://schemas.android.com/aapt"'
596657

597658
generatedOutput += '\n' + INDENT + 'android:width="{0}dp"\n'.f(width);
598659
generatedOutput += INDENT + 'android:height="{0}dp"\n'.f(height);
@@ -876,4 +937,4 @@ function showLastUpdate(repo) {
876937
}
877938
});
878939
});
879-
}
940+
}

0 commit comments

Comments
 (0)