@@ -148,6 +148,7 @@ var lastFileName = "";
148148var lastFileData ;
149149var warnings = [ ] ;
150150var svgStyles = { } ;
151+ var gradients = { } ;
151152var globalSvg ;
152153
153154var clipPathEnabled = false ;
@@ -234,6 +235,10 @@ function recursiveTreeWalk(parent, groupLevel, clipPath) {
234235}
235236
236237function 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+
553612function 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