import Ġgro ovy . json . Json Generator Ċ import Ġgro ovy . json . Json Output Ċ import Ġgro ovy . util . Node Ċ import Ġgro ovy . util . NodeList Ċ import Ġgro ovy . util . Xml Parser Ċ import Ġgro ovy jar jar common sc li . Default Parser Ċ import Ġgro ovy jar jar common sc li . Help Formatter Ċ import Ġgro ovy jar jar common sc li . Options Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġ// ĠCall Ġthe Ġconverter Ġfrom ĠIDEA ĊĠĠĠ Ġprintln (" Starting ĠSVG Ġto Ġ. sh ap esh ifter Ġconversion ...") ĊĠĠĠ Ġ// Convert SVG (). render File (" examples / 0 0 0 1 - 0 0 3 0 . svg ") ĊĠĠĠ Ġ// ĠUse Ġfrom Ġthe Ġcommand line ĊĠĠĠ ĠConvert SVG ( args ) ĊĠĠĠ Ġprintln (" Completed ĠSVG Ġto Ġ. sh ap esh ifter .") Ċ } Ċ Ċ class ĠConvert SVG () Ġ{ ĊĠĠĠ Ġvar Ġframe Interval Ġ= Ġ 5 ĊĠĠĠ Ġvar Ġtime Interval Ġ= Ġ 5 0 ĊĊĊĠĠĠ Ġconstructor ( args : ĠArray < String >) Ġ: Ġthis () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠDefault Parser () ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠOptions () ĊĠĠĠĠĠĠĠ Ġwith ( options ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Option (" h ", Ġ" help ", Ġfalse , Ġ" Print Ġthis Ġhelp Ġmessage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Option (" time ", Ġ" time Interval ", Ġtrue , Ġ" Sets Ġthe Ġtime Ġinterval Ġbetween Ġkey frames Ġfor Ġanimations Ġ[ in Ġ 1 / 1 0 0 th Ġof Ġseconds ]\ n Default : Ġ 2 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Option (" frame ", Ġ" frame Interval ", Ġtrue , Ġ" Sets Ġthe Ġnumber Ġof Ġframes Ġto Ġskip Ġbetween Ġkey frames Ġwhen Ġexporting .\ n ĠDefault : Ġ 5 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Option (" f ", Ġ" file ", Ġtrue , Ġ" File Ġto Ġconvert ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġparser . parse ( options , Ġargs ) ĊĠĠĠĠĠĠĠ Ġval Ġformatter Ġ= ĠHelp Formatter () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cmd . has Option (" time ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġcmd . getOption Value (" time "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Ġ> Ġ 0 ) Ġtime Interval Ġ= Ġtime ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( cmd . has Option (" frame ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframe Ġ= Ġcmd . getOption Value (" frame "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( frame Ġ> Ġ 0 ) Ġframe Interval Ġ= Ġframe ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! cmd . has Option (" file ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" You Ġneed Ġto Ġspecify Ġa Ġfile .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatter . print Help (" SVG 2 Shape Sh ifter ", Ġoptions ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Con verting Ġfile : Ġ"+ Ġcmd . getOption Value (" file ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender File ( cmd . getOption Value (" file ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġrender File ( filename : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLoad ĠSVG Ġgenerated Ġfrom ĠBl ender ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filename ) ĊĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠFile ( file . name . remove Suffix (". svg ") Ġ+ Ġ". sh ap esh ifter ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" File Ġ${ file . name } Ġdoesn 't Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" Write Ġto Ġconverted Ġfile : Ġ"+ ĠoutputFile ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsvg Ġ= ĠXml Parser (). parse ( file ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsvg Height Ġ= Ġsvg . attribute (" height "). toString (). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġsvg Width Ġ= Ġsvg . attribute (" width "). toString (). toInt () ĊĊĠĠĠĠĠĠĠ Ġ// Ġfirst Ġchild Ġis Ġalways ĠRender Layer _ Line Set ĊĠĠĠĠĠĠĠ Ġval Ġrender Layer _ Line Set Ġ= Ġ( svg . get (" g ") Ġas ĠNode List )[ 0 ] Ġas ĠNode ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġvalue Ġof Ġrender Layer _ Line Set Ġis Ġeither Ġa ĠNode List Ġof Ġframes ĊĠĠĠĠĠĠĠ Ġ// Ġframe _ 0 0 0 1 , Ġframe _ 0 0 0 2 , Ġ... Ġframe _ NNNN Ġ-> Ġfill s , Ġst ro kes ĊĠĠĠĠĠĠĠ Ġ// Ġor ĊĠĠĠĠĠĠĠ Ġ// Ġ( single Ġframe ) Ġfill s , Ġst ro kes ĊĠĠĠĠĠĠĠ Ġwhen Ġ( is Multi Frame SVG ( render Layer _ Line Set )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawing Data Ġ= Ġload Frame Zero And Animation ( render Layer _ Line Set ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġcompose Animation ( svg Height , Ġsvg Width , Ġdrawing Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile . write Text ( Json Output . pretty Print ( json )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġload Single Frame ( svg Height , Ġsvg Width , Ġrender Layer _ Line Set ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile . write Text ( Json Output . pretty Print ( json )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Multi Frame SVG ( node : ĠNode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġframes Ġ= Ġ( node . value () Ġas ĠNode List ) ĊĠĠĠĠĠĠĠ Ġ// ĠNode . value Ġwill Ġeither Ġbe Ġa Ġgroup Ġof Ġfill s Ġand Ġa Ġgroup Ġof Ġpaths ĊĠĠĠĠĠĠĠ Ġ// Ġor Ġkey frame ( s ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġframe Ġis ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Frames Ġ= Ġframes . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġit Ġas ĠNode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattributes Map Ġ= Ġn . attributes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Map [" id "]. toString (). startsWith (" frame _ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Frames . size Ġ> Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Frame Zero And Animation ( render Layer _ Line Set : ĠNode ): ĠHashMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġframes Ġ= Ġ( render Layer _ Line Set . value () Ġas ĠNode List ) ĊĠĠĠĠĠĠĠ Ġval Ġprocessed Frames Ġ= Ġarray ListOf < Map < String , ĠGroup >>() ĊĊĠĠĠĠĠĠĠ Ġframes . forEach Indexed Ġ{ Ġ_, Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfill s Ġ= Ġprocess Paths (" fill s ", Ġnode Ġas ĠNode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst ro kes Ġ= Ġprocess Paths (" stro kes ", Ġnode Ġas ĠNode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessed Frames . add ( map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fill s " Ġto Ġfill s , Ġ" stro kes " Ġto Ġst ro kes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar ĠcurrentTime Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġsanitize Frame Id Ġ= Ġ{ frame : Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġframe . attribute (" id "). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint String : String Ġ= Ġid . remove Prefix (" frame _ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger . parseInt ( int String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġframe Id Ġ= Ġsanitize Frame Id ( frames [ 0 ] Ġas ĠNode ) ĊĠĠĠĠĠĠĠ Ġif Ġ( frame Id Ġ>= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ= Ġframe Id Ġ* Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= Ġarray ListOf < Timeline Block >() ĊĠĠĠĠĠĠĠ Ġval Ġframe 0 Ġ= Ġprocessed Frames [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġframe 0 Fill s Ġ= Ġframe 0 [" fill s "] ĊĠĠĠĠĠĠĠ Ġval Ġframe 0 St ro kes Ġ= Ġframe 0 [" stro kes "] ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġprocessed Frames . size Ġ- Ġ 1 Ġstep Ġframe Interval ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Frame Ġ= Ġprocessed Frames [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Frame Fill s Ġ= Ġcurrent Frame [" fill s "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Frame St ro kes Ġ= Ġcurrent Frame [" stro kes "] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Frame Ġ= Ġprocessed Frames . get OrNull ( index Ġ+ Ġframe Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Frame Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Frame Fill s Ġ= Ġnext Frame [" fill s "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Frame St ro kes Ġ= Ġnext Frame [" stro kes "] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġframe 0 Fill s ?. children !!. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Group For Animation ( frame 0 Fill s , Ġi , Ġcurrent Frame Fill s , Ġnext Frame Fill s , ĠcurrentTime , Ġblocks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġframe 0 St ro kes ?. children !!. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Group For Animation ( frame 0 St ro kes , Ġj , Ġcurrent Frame St ro kes , Ġnext Frame St ro kes , ĠcurrentTime , Ġblocks , Ġis Fill Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ+= Ġtime Interval ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĠAnimation Timeline ( UUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocks Ġ= Ġblocks ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġanimation . fix Duration (); ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhash Map Of (" frame 0 " Ġto Ġarray ListOf ( frame 0 Fill s , Ġframe 0 St ro kes ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" animation " Ġto Ġanimation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Group For Animation ( frame Fill Or St ro kes : ĠGroup , Ġi : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Frame Group : ĠGroup ?, Ġnext Frame Group : ĠGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime : ĠInt , Ġblocks : ĠArrayList < Timeline Block >, Ġis Fill : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġfor Ġpossible Ġcolor Ġanimation Ġblock ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Color : ĠString ? Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġnext Frame Color : ĠString ? Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Alpha : ĠNumber ? Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnext Frame Alpha : ĠNumber ? Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcolor Property : ĠTimeline Property Ġ= ĠTimeline Property . FILL _ COLOR ĊĠĠĠĠĠĠĠ Ġvar Ġalpha Property : ĠTimeline Property Ġ= ĠTimeline Property . FILL _ ALPHA ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġpath Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Path Ġ= Ġ( current Frame Group !!. children [ i ] Ġas ĠPath ). path Data !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Path Ġ= Ġ( next Frame Group !!. children [ i ] Ġas ĠPath ). path Data !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Path Ġ!= Ġnext Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimeline Block Ġ= ĠTimeline Block ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (). toString (). replace ("- ","" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayer Id Ġ= Ġ( frame Fill Or St ro kes . children [ i ] Ġas ĠPath ). id , ĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnever Ġchanges ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠTimeline Type . PATH . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Value Ġ= Ġcurrent Path , ĠĠ Ġ// Ġchanges Ġper Ġframe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Value Ġ= Ġnext Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpropertyName Ġ= ĠTimeline Property . PATH _ DATA . id , ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= ĠcurrentTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendTime Ġ= ĠcurrentTime Ġ+ Ġtime Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocks . add ( timeline Block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( is Fill ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Color Ġ= Ġ( current Frame Group . children [ i ] Ġas ĠPath ). fill Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Alpha Ġ= Ġ( current Frame Group . children [ i ] Ġas ĠPath ). fill Alpha ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Frame Color Ġ= Ġ( next Frame Group . children [ i ] Ġas ĠPath ). fill Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Frame Alpha Ġ= Ġ( next Frame Group . children [ i ] Ġas ĠPath ). fill Alpha ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Color Ġ= Ġ( current Frame Group . children [ i ] Ġas ĠPath ). stroke Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Alpha Ġ= Ġ( current Frame Group . children [ i ] Ġas ĠPath ). stroke Alpha ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Frame Color Ġ= Ġ( next Frame Group . children [ i ] Ġas ĠPath ). stroke Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Frame Alpha Ġ= Ġ( next Frame Group . children [ i ] Ġas ĠPath ). stroke Alpha ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Property Ġ= ĠTimeline Property . ST RO KE _ COLOR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Property Ġ= ĠTimeline Property . ST RO KE _ ALPHA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentColor Ġ!= Ġnext Frame Color ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Timeline Block Ġ= ĠTimeline Block ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (). toString (). replace ("- ","" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayer Id Ġ= Ġ( frame Fill Or St ro kes . children [ i ] Ġas ĠPath ). id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠTimeline Type . COLOR . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpropertyName Ġ= Ġcolor Property . id , ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Value Ġ= Ġcurrent Color !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Value Ġ= Ġnext Frame Color !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= ĠcurrentTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendTime Ġ= ĠcurrentTime Ġ+ Ġtime Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocks . add ( color Timeline Block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Alpha Ġ!= Ġnext Frame Alpha ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Timeline Block Ġ= ĠTimeline Block ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (). toString (). replace ("- ","" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayer Id Ġ= Ġ( frame Fill Or St ro kes . children [ i ] Ġas ĠPath ). id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠTimeline Type . NUMBER . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpropertyName Ġ= Ġalpha Property . id , ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Value Ġ= Ġcurrent Alpha !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Value Ġ= Ġnext Frame Alpha !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= ĠcurrentTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendTime Ġ= ĠcurrentTime Ġ+ Ġtime Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocks . add ( color Timeline Block ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( ex . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġprocess Paths ( id : ĠString , Ġnode : ĠNode ): ĠGroup Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= Ġ( node . value () Ġas ĠNode List ). filter Ġ{ Ġn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( n Ġas ĠNode ). attribute (" id "). equals ( id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġarray ListOf < Path Primitive >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( paths . size Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode List Ġ= Ġ(( paths . get ( 0 ) Ġas ĠNode ). value () Ġas ĠNode List ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode List . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( process Path ( UUID . randomUUID (). toString (). replace ("- ","" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ id -$ index ", Ġ( it Ġas ĠNode ). attributes () Ġas ĠHashMap < String , ĠString > )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= ĠGroup ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (). toString (). replace ("- ","" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġchildren ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġgroup ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġcompose Animation ( svg Height : ĠInt , Ġsvg Width : ĠInt , Ġdrawing Data : ĠHashMap < String , ĠAny >): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġlayer Ġ= ĠLayer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (). toString (). replace ("- ","" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" vector ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġsvg Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġsvg Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġdrawing Data [" frame 0 "] Ġas ĠArrayList < Group > ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" version " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" generated by " Ġto Ġ" GH :/ j will / android - av d - tools ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" layers " Ġto Ġlayers To JSON ( layer ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline To JSON ( drawing Data [" animation "] Ġas ĠAnimation Timeline ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcustom Json Output Ġ= ĠJson Generator . Options (). exclude Null s (). build () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcustom Json Output . toJson ( jsonObject ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Single Frame ( svg Height : ĠInt , Ġsvg Width : ĠInt , Ġrender Layer _ Line Set : ĠNode ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġarray ListOf < Group >() ĊĊĠĠĠĠĠĠĠ Ġgroups . add ( process Paths (" fill s ", Ġrender Layer _ Line Set )) ĊĠĠĠĠĠĠĠ Ġgroups . add ( process Paths (" stro kes ", Ġrender Layer _ Line Set )) ĊĊĠĠĠĠĠĠĠ Ġval Ġlayer Ġ= ĠLayer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (). toString (). replace ("- ","" ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" vector ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġsvg Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġsvg Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġgroups ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĠAnimation Timeline (" 4 5 ") ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" version " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" layers " Ġto Ġlayers To JSON ( layer ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline To JSON ( animation ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġcustom Json Output Ġ= ĠJson Generator . Options (). exclude Null s (). build () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcustom Json Output . toJson ( jsonObject ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlayers To JSON ( layer : ĠLayer ): ĠMap < Any , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" vector Layer " Ġto Ġlayer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtimeline To JSON ( animation : ĠAnimation Timeline ): ĠPair < Any , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" timeline ", Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" animation " Ġto Ġanimation ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Line Cap ( props : ĠHashMap < String , ĠString >): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġprops [" stroke - line cap "] ĊĠĠĠĠĠĠĠ Ġif Ġ( property Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSt roke Line Cap . valueOf ( property . toUpperCase ()). id ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Line Join ( props : ĠHashMap < String , ĠString >): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġprops [" stroke - line join "] ĊĠĠĠĠĠĠĠ Ġif Ġ( property Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSt roke Line Join . valueOf ( property . toUpperCase ()). id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Fill Type ( props : ĠHashMap < String , ĠString >): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfill Type Ġ= Ġprops [" fill _ rule "] ĊĠĠĠĠĠĠĠ Ġwhen Ġ( fill Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBl ender Ġgenerates Ġsome Ġnon - comp liant ĠSVG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// " even Odd ", Ġ" evenodd " Ġ-> Ġreturn ĠFill Type . E VEN _ O DD . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" non Zero " Ġ-> Ġreturn ĠFill Type . NON _ ZERO . id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconvert RGB 2 Hex ( color : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor . startsWith ("# ") Ġ-> Ġ// ĠColor Ġalready Ġin Ġhex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ== Ġ" none " Ġ-> Ġ// ĠNo Ġcolor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor . startsWith (" rgb ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcolor ( 2 0 4 , Ġ 2 0 4 , Ġ 2 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( r , Ġg , Ġb ) Ġ= Ġcolor . replace (" rgb (", Ġ""). replace (" )", Ġ""). split (",") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"# % 0 2 X % 0 2 X % 0 2 X ". format ( r . trim (). toInt (), Ġg . trim (). toInt (), Ġb . trim (). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess Path ( id : ĠString , Ġname : ĠString , Ġprops : ĠHashMap < String , ĠString >): ĠPath Primitive Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Cap Ġ= Ġcheck Line Cap ( props ) ĊĠĠĠĠĠĠĠ Ġval Ġline Join Ġ= Ġcheck Line Join ( props ) ĊĠĠĠĠĠĠĠ Ġval Ġfill Type Ġ= Ġcheck Fill Type ( props ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠPath ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Data Ġ= Ġprops [" d "], ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Color Ġ= Ġconvert RGB 2 Hex ( props [" fill "]. toString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Alpha Ġ= Ġprops [" fill - opacity "] ?. toDouble OrNull (), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Color Ġ= Ġconvert RGB 2 Hex ( props [" stroke "]. toString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġprops [" stroke - width "] ?. toDouble OrNull (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Alpha Ġ= Ġprops [" stroke - opacity "] ?. toDouble OrNull (), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Line Cap Ġ= Ġline Cap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Line Join Ġ= Ġline Join , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke M itter Limit Ġ= Ġprops [" stroke - mit er limit "] ?. toInt OrNull (), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Type Ġ= Ġfill Type , ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġused Ġby ĠSVG Ġit Ġseems ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrim Path End Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrim Path Start Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrim Path Offset Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠ Ġ} Ċ Ċ }