package Ġcom . so y wiz . kor fl . as 3 sw f Ċ Ċ import Ġcom . so y wiz . kor fl . internal .* Ċ import Ġcom . so y wiz . kor fl . internal . min 2 Ċ import Ġcom . so y wiz . kor im . vector .* Ċ import Ġcom . so y wiz . kor io . lang .* Ċ import Ġcom . so y wiz . k orm a . geom .* Ċ import Ġkotlin . collections . set Ċ import Ġkotlin . math .* Ċ Ċ class ĠSW F Action Value Ġ{ Ċ ĉ var Ġtype : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġstring : ĠString ? Ġ= Ġnull Ċ ĉ var Ġnumber : ĠDouble Ġ= Ġ 0 . 0 Ċ ĉ var Ġregister : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġboolean : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġinteger : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġconstant : ĠInt Ġ= Ġ 0 ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ private Ġvar Ġba Ġ= ĠSW F Action Value . init Tmp Buffer () ĊĊĉ ĉ private Ġfun Ġinit Tmp Buffer (): ĠFlash ByteArray Ġ{ Ċĉĉ ĉ val Ġba Tmp Ġ= ĠFlash ByteArray () Ċĉĉ ĉ ba Tmp . endian Ġ= ĠEn dian . LIT TLE _ ENDIAN Ċĉĉ ĉ ba Tmp . length Ġ= Ġ 8 Ċĉĉ ĉ return Ġba Tmp Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ type Ġ= Ġdata . read UI 8 () Ċĉ ĉ when Ġ( type ) Ġ{ Ċĉĉ ĉ Action ValueType . STRING Ġ-> Ġstring Ġ= Ġdata . readString () Ċĉĉ ĉ Action ValueType . FLOAT Ġ-> Ġnumber Ġ= Ġdata . read FLOAT () Ċĉĉ ĉ Action ValueType . NIL Ġ-> ĠUnit Ċĉĉ ĉ Action ValueType . UNDEFINED Ġ-> ĠUnit Ċĉĉ ĉ Action ValueType . REGISTER Ġ-> Ġregister Ġ= Ġdata . read UI 8 () Ċĉĉ ĉ Action ValueType . BOOLEAN Ġ-> Ġboolean Ġ= Ġ( data . read UI 8 () Ġ!= Ġ 0 ) Ċĉĉ ĉ Action ValueType . DOUBLE Ġ-> Ġ{ Ċĉĉĉ ĉ SW F Action Value . ba . position Ġ= Ġ 0 Ċĉĉĉ ĉ SW F Action Value . ba [ 4 ] Ġ= Ġdata . read UI 8 () Ċĉĉĉ ĉ SW F Action Value . ba [ 5 ] Ġ= Ġdata . read UI 8 () Ċĉĉĉ ĉ SW F Action Value . ba [ 6 ] Ġ= Ġdata . read UI 8 () Ċĉĉĉ ĉ SW F Action Value . ba [ 7 ] Ġ= Ġdata . read UI 8 () Ċĉĉĉ ĉ SW F Action Value . ba [ 0 ] Ġ= Ġdata . read UI 8 () Ċĉĉĉ ĉ SW F Action Value . ba [ 1 ] Ġ= Ġdata . read UI 8 () Ċĉĉĉ ĉ SW F Action Value . ba [ 2 ] Ġ= Ġdata . read UI 8 () Ċĉĉĉ ĉ SW F Action Value . ba [ 3 ] Ġ= Ġdata . read UI 8 () Ċĉĉĉ ĉ number Ġ= ĠSW F Action Value . ba . read Double () Ċĉĉ ĉ } Ċĉĉ ĉ Action ValueType . INTEGER Ġ-> Ġinteger Ġ= Ġdata . read UI 3 2 () Ċĉĉ ĉ Action ValueType . CONSTANT _ 8 Ġ-> Ġconstant Ġ= Ġdata . read UI 8 () Ċĉĉ ĉ Action ValueType . CONSTANT _ 1 6 Ġ-> Ġconstant Ġ= Ġdata . read UI 1 6 () Ċĉĉ ĉ else Ġ-> Ċĉĉĉ ĉ throw ( Error (" Unknown ĠAction ValueType : Ġ" Ġ+ Ġtype )) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ return Ġwhen Ġ( type ) Ġ{ Ċĉĉ ĉ Action ValueType . STRING Ġ-> Ġ"$ string Ġ( string )" Ċĉĉ ĉ Action ValueType . FLOAT Ġ-> Ġ"$ number Ġ( float )" Ċĉĉ ĉ Action ValueType . NIL Ġ-> Ġ" null " Ċĉĉ ĉ Action ValueType . UNDEFINED Ġ-> Ġ" undefined " Ċĉĉ ĉ Action ValueType . REGISTER Ġ-> Ġ"$ register Ġ( register )" Ċĉĉ ĉ Action ValueType . BOOLEAN Ġ-> Ġ"$ boolean Ġ( boolean )" Ċĉĉ ĉ Action ValueType . DOUBLE Ġ-> Ġ"$ number Ġ( double )" Ċĉĉ ĉ Action ValueType . INTEGER Ġ-> Ġ"$ integer Ġ( integer )" Ċĉĉ ĉ Action ValueType . CONSTANT _ 8 Ġ-> Ġ"$ constant Ġ( constant 8 )" Ċĉĉ ĉ Action ValueType . CONSTANT _ 1 6 Ġ-> Ġ"$ constant Ġ( constant 1 6 )" Ċĉĉ ĉ else Ġ-> Ġ" unknown " Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġto Byte code String ( c pool : ĠList < String >): ĠString Ġ{ Ċĉ ĉ return Ġwhen Ġ( type ) Ġ{ Ċĉĉ ĉ Action ValueType . STRING Ġ-> Ġ"\"" Ġ+ Ġ( string ) Ġ+ Ġ"\"" Ċĉĉ ĉ Action ValueType . FLOAT , ĠAction ValueType . DOUBLE Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġstr Ġ= Ġnumber . toString () Ċĉĉĉ ĉ if Ġ( str . indexOf (".") Ġ== Ġ- 1 ) Ġ{ Ċĉĉĉĉ ĉ str Ġ+ Ġ". 0 " Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ str Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ Action ValueType . NIL Ġ-> Ġ" null " Ċĉĉ ĉ Action ValueType . UNDEFINED Ġ-> Ġ" undefined " Ċĉĉ ĉ Action ValueType . REGISTER Ġ-> Ġ"$ " Ġ+ Ġregister Ċĉĉ ĉ Action ValueType . BOOLEAN Ġ-> Ġboolean . toString () Ċĉĉ ĉ Action ValueType . INTEGER Ġ-> Ġinteger . toString () Ċĉĉ ĉ Action ValueType . CONSTANT _ 8 , ĠAction ValueType . CONSTANT _ 1 6 Ġ-> Ġ"\"" Ġ+ Ġ( c pool [ constant ]) Ġ+ Ġ"\"" Ċĉĉ ĉ else Ġ-> Ġ" UNKNOWN " Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ class ĠSW F Button Cond Action Ġ{ Ċ ĉ @ Suppress (" unused ") Ċ ĉ var Ġcond Action Size Ġ= Ġ 0 Ċ ĉ var Ġcond Idle To Over Down Ġ= Ġfalse Ċ ĉ var Ġcond Out Down To Idle Ġ= Ġfalse Ċ ĉ var Ġcond Out Down To Over Down Ġ= Ġfalse Ċ ĉ var Ġcond Over Down To Out Down Ġ= Ġfalse Ċ ĉ var Ġcond Over Down To Over Up Ġ= Ġfalse Ċ ĉ var Ġcond Over Up To Over Down Ġ= Ġfalse Ċ ĉ var Ġcond Over Up To Idle Ġ= Ġfalse Ċ ĉ var Ġcond Idle To Over Up Ġ= Ġfalse Ċ ĉ var Ġcond Over Down To Idle Ġ= Ġfalse Ċ ĉ var Ġcond KeyPress Ġ= Ġ 0 ĊĊ ĉ private Ġvar Ġactions Ġ= ĠArrayList < I Action >() ĊĊ ĉ private Ġvar Ġlabel Count : ĠInt Ġ= Ġ 0 ĊĊ ĉ fun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ val Ġflags : ĠInt Ġ= Ġ( data . read UI 8 () Ġshl Ġ 8 ) Ġor Ġdata . read UI 8 () Ċĉ ĉ cond Idle To Over Down Ġ= Ġ(( flags Ġand Ġ 0 x 8 0 0 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ cond Out Down To Idle Ġ= Ġ(( flags Ġand Ġ 0 x 4 0 0 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ cond Out Down To Over Down Ġ= Ġ(( flags Ġand Ġ 0 x 2 0 0 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ cond Over Down To Out Down Ġ= Ġ(( flags Ġand Ġ 0 x 1 0 0 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ cond Over Down To Over Up Ġ= Ġ(( flags Ġand Ġ 0 x 0 8 0 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ cond Over Up To Over Down Ġ= Ġ(( flags Ġand Ġ 0 x 0 4 0 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ cond Over Up To Idle Ġ= Ġ(( flags Ġand Ġ 0 x 0 2 0 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ cond Idle To Over Up Ġ= Ġ(( flags Ġand Ġ 0 x 0 1 0 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ cond Over Down To Idle Ġ= Ġ(( flags Ġand Ġ 0 x 0 0 0 1 ) Ġ!= Ġ 0 ) Ċĉ ĉ cond KeyPress Ġ= Ġ( flags Ġand Ġ 0 xff ) Ġ ush r Ġ 1 Ċĉ ĉ var Ġaction : ĠI Action ? Ċĉ ĉ while Ġ( true ) Ġ{ Ċĉĉ ĉ action Ġ= Ġdata . read ACTION RECORD () Ċĉĉ ĉ if Ġ( action Ġ== Ġnull ) Ġbreak Ċĉĉ ĉ actions . add ( action ) Ċĉ ĉ } Ċĉ ĉ label Count Ġ= ĠAction . resolve Offsets ( actions ) Ċ ĉ } ĊĊ ĉ fun ĠtoString ( indent : ĠInt Ġ= Ġ 0 , Ġflags : ĠInt Ġ= Ġ 0 ): ĠString Ġ{ Ċĉ ĉ val Ġa Ġ= Ġarray ListOf < String >() Ċĉ ĉ if Ġ( cond Idle To Over Down ) Ġa . add (" idle To Over Down ") Ċĉ ĉ if Ġ( cond Out Down To Idle ) Ġa . add (" out Down To Idle ") Ċĉ ĉ if Ġ( cond Out Down To Over Down ) Ġa . add (" out Down To Over Down ") Ċĉ ĉ if Ġ( cond Over Down To Out Down ) Ġa . add (" over Down To Out Down ") Ċĉ ĉ if Ġ( cond Over Down To Over Up ) Ġa . add (" over Down To Over Up ") Ċĉ ĉ if Ġ( cond Over Up To Over Down ) Ġa . add (" over Up To Over Down ") Ċĉ ĉ if Ġ( cond Over Up To Idle ) Ġa . add (" over Up To Idle ") Ċĉ ĉ if Ġ( cond Idle To Over Up ) Ġa . add (" idle To Over Up ") Ċĉ ĉ if Ġ( cond Over Down To Idle ) Ġa . add (" over Down To Idle ") Ċĉ ĉ var Ġstr : ĠString Ġ= Ġ" Cond Action Record Ġ(" Ġ+ Ġa . join ToString (", Ġ") Ġ+ Ġ")" Ċĉ ĉ if Ġ( cond KeyPress Ġ> Ġ 0 ) Ġstr Ġ+= Ġ", ĠKey Press : Ġ" Ġ+ Ġcond KeyPress Ċĉ ĉ if Ġ(( flags Ġand Ġcom . so y wiz . kor fl . as 3 sw f . SW F . TO STRING _ FLAG _ AV M 1 _ BYTE CODE ) Ġ== Ġ 0 ) Ġ{ Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġactions . size ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ"[" Ġ+ Ġi Ġ+ Ġ"] Ġ" Ġ+ Ġactions [ i ]. toString ( indent Ġ+ Ġ 2 ) Ċĉĉ ĉ } Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ val Ġcontext Ġ= Ċĉĉĉ ĉ Action ExecutionContext ( actions , Ġarray ListOf (), Ġlabel Count ) Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġactions . size ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 4 ) Ġ+ Ġactions [ i ]. to Byte code ( indent Ġ+ Ġ 4 , Ġcontext ) Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( context . end Label Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 4 ) Ġ+ Ġcontext . end Label Ġ+ Ġ":" Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } Ċ } Ċ Ċ class ĠSW F Button Record Ġ{ Ċ ĉ var Ġhas Blend Mode : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġhas Filter List : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġstate Hit Test : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġstate Down : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġstate Over : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġstate Up : ĠBoolean Ġ= Ġfalse ĊĊ ĉ var Ġcharacter Id : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġplace Depth : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġplace Matrix : ĠSW F Matrix ? Ġ= Ġnull Ċ ĉ var Ġcolor Transform : ĠSW F Color Transform With Alpha ? Ġ= Ġnull Ċ ĉ var Ġblend Mode : ĠInt Ġ= Ġ 0 ĊĊ ĉ protected Ġvar Ġfilter List Ġ= ĠArrayList < I Filter >() ĊĊ ĉ fun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt Ġ= Ġ 1 ) Ġ{ Ċĉ ĉ val Ġflags : ĠInt Ġ= Ġdata . read UI 8 () Ċĉ ĉ state Hit Test Ġ= Ġ(( flags Ġand Ġ 0 x 0 8 ) Ġ!= Ġ 0 ) Ċĉ ĉ state Down Ġ= Ġ(( flags Ġand Ġ 0 x 0 4 ) Ġ!= Ġ 0 ) Ċĉ ĉ state Over Ġ= Ġ(( flags Ġand Ġ 0 x 0 2 ) Ġ!= Ġ 0 ) Ċĉ ĉ state Up Ġ= Ġ(( flags Ġand Ġ 0 x 0 1 ) Ġ!= Ġ 0 ) Ċĉ ĉ character Id Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ place Depth Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ place Matrix Ġ= Ġdata . read MATRIX () Ċĉ ĉ if Ġ( level Ġ>= Ġ 2 ) Ġ{ Ċĉĉ ĉ color Transform Ġ= Ġdata . read CX FORM WITH ALPHA () Ċĉĉ ĉ has Filter List Ġ= Ġ(( flags Ġand Ġ 0 x 1 0 ) Ġ!= Ġ 0 ) Ċĉĉ ĉ if Ġ( has Filter List ) Ġ{ Ċĉĉĉ ĉ val ĠnumberOf Filters : ĠInt Ġ= Ġdata . read UI 8 () Ċĉĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil ĠnumberOf Filters ) Ġ{ Ċĉĉĉĉ ĉ filter List . add ( data . read FILTER ()) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ has Blend Mode Ġ= Ġ(( flags Ġand Ġ 0 x 2 0 ) Ġ!= Ġ 0 ) Ċĉĉ ĉ if Ġ( has Blend Mode ) Ġ{ Ċĉĉĉ ĉ blend Mode Ġ= Ġdata . read UI 8 () Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun ĠtoString ( indent : ĠInt Ġ= Ġ 0 ): ĠString Ġ{ Ċĉ ĉ var Ġstr Ġ= Ġ" Depth : Ġ$ place Depth , ĠCharacter ID : Ġ$ character Id , ĠStates : Ġ" Ċĉ ĉ val Ġstates Ġ= Ġarray ListOf < String >() Ċĉ ĉ if Ġ( state Up ) Ġstates . add (" up ") Ċĉ ĉ if Ġ( state Over ) Ġstates . add (" over ") Ċĉ ĉ if Ġ( state Down ) Ġstates . add (" down ") Ċĉ ĉ if Ġ( state Hit Test ) Ġstates . add (" hit ") Ċĉ ĉ str Ġ+= Ġstates . join ToString (",") Ċĉ ĉ if Ġ( has Blend Mode ) Ġstr Ġ+= Ġ", ĠBlend Mode : Ġ" Ġ+ ĠBlend Mode . toString ( blend Mode ) Ċĉ ĉ if Ġ( place Matrix Ġ!= Ġnull Ġ&& Ġ! place Matrix !!. is Identity ()) Ġstr Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ" Matrix : Ġ" Ġ+ Ġplace Matrix Ċĉ ĉ if Ġ( color Transform Ġ!= Ġnull Ġ&& Ġ! color Transform !!. is Identity ()) Ġstr Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ" Color Transform : Ġ" Ġ+ Ġcolor Transform Ċĉ ĉ if Ġ( has Filter List ) Ġ{ Ċĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ" Filters :" Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġfilter List . size ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 4 ) Ġ+ Ġ"[" Ġ+ Ġi Ġ+ Ġ"] Ġ" Ġ+ Ġfilter List [ i ]. toString ( indent Ġ+ Ġ 4 ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } Ċ } Ċ Ċ class ĠSW FC lip Action Record Ġ{ Ċ ĉ late init Ġvar Ġevent Flags : ĠSW FC lip Event Flags Ċ ĉ var ĠkeyCode : ĠInt Ġ= Ġ 0 ĊĊ ĉ var Ġactions Ġ= ĠArrayList < I Action >() ĊĊ ĉ var Ġlabel Count : ĠInt Ġ= Ġ 0 ĊĊ ĉ fun Ġparse ( data : ĠSW F Data , Ġversion : ĠInt ) Ġ{ Ċĉ ĉ event Flags Ġ= Ġdata . read CLI PE VENT FLAGS ( version ) Ċĉ ĉ data . read UI 3 2 () Ġ// Ġaction Record Size , Ġnot Ġneeded Ġhere Ċĉ ĉ if Ġ( event Flags . key Press Event ) Ġ{ Ċĉĉ ĉ keyCode Ġ= Ġdata . read UI 8 () Ċĉ ĉ } Ċĉ ĉ while Ġ( true ) Ġ{ Ċĉĉ ĉ actions . add ( data . read ACTION RECORD () Ġ?: Ġbreak ) Ċĉ ĉ } Ċĉ ĉ label Count Ġ= ĠAction . resolve Offsets ( actions ) Ċ ĉ } ĊĊ ĉ fun ĠtoString ( indent : ĠInt Ġ= Ġ 0 , Ġflags : ĠInt Ġ= Ġ 0 ): ĠString Ġ{ Ċĉ ĉ var Ġstr : ĠString Ġ= Ġ" Clip Action Record Ġ(" Ġ+ Ġevent Flags . toString () Ġ+ Ġ")" Ċĉ ĉ if Ġ( keyCode Ġ> Ġ 0 ) Ġ{ Ċĉĉ ĉ str Ġ+= Ġ", ĠKeyCode : Ġ" Ġ+ ĠkeyCode Ċĉ ĉ } Ċĉ ĉ if Ġ(( flags Ġand Ġcom . so y wiz . kor fl . as 3 sw f . SW F . TO STRING _ FLAG _ AV M 1 _ BYTE CODE ) Ġ== Ġ 0 ) Ġ{ Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġactions . size ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ"[" Ġ+ Ġi Ġ+ Ġ"] Ġ" Ġ+ Ġactions [ i ]. toString ( indent Ġ+ Ġ 2 ) Ċĉĉ ĉ } Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ val Ġcontext Ġ= ĠAction ExecutionContext ( actions , Ġarray ListOf (), Ġlabel Count ) Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġactions . size ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 4 ) Ġ+ Ġactions [ i ]. to Byte code ( indent Ġ+ Ġ 4 , Ġcontext ) Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( context . end Label Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 4 ) Ġ+ Ġcontext . end Label Ġ+ Ġ":" Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } Ċ } Ċ Ċ class ĠSW FC lip Actions Ġ{ Ċ ĉ late init Ġvar Ġevent Flags : ĠSW FC lip Event Flags ĊĊ ĉ protected Ġvar Ġrecords Ġ= Ġarray ListOf < SW FC lip Action Record >() ĊĊ ĉ fun Ġparse ( data : ĠSW F Data , Ġversion : ĠInt ) Ġ{ Ċĉ ĉ data . read UI 1 6 () Ġ// Ġreserved , Ġalways Ġ 0 Ċĉ ĉ event Flags Ġ= Ġdata . read CLI PE VENT FLAGS ( version ) Ċĉ ĉ while Ġ( true ) Ġrecords . add ( data . read CLIP ACTION RECORD ( version ) Ġ?: Ġbreak ) Ċ ĉ } ĊĊ ĉ fun ĠtoString ( indent : ĠInt Ġ= Ġ 0 , Ġflags : ĠInt Ġ= Ġ 0 ): ĠString Ġ{ Ċĉ ĉ var Ġstr : ĠString Ġ= Ġ" Clip Actions Ġ(" Ġ+ Ġevent Flags . toString () Ġ+ Ġ" ): " Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġrecords . size ) Ġ{ Ċĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ"[" Ġ+ Ġi Ġ+ Ġ"] Ġ" Ġ+ Ġrecords [ i ]. toString ( indent Ġ+ Ġ 2 , Ġflags ) Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } Ċ } Ċ Ċ class ĠSW FC lip Event Flags Ġ{ Ċ ĉ var Ġkey Up Event Ġ= Ġfalse Ċ ĉ var Ġkey Down Event Ġ= Ġfalse Ċ ĉ var Ġmouse Up Event Ġ= Ġfalse Ċ ĉ var Ġmouse Down Event Ġ= Ġfalse Ċ ĉ var Ġmouse Move Event Ġ= Ġfalse Ċ ĉ var Ġun load Event Ġ= Ġfalse Ċ ĉ var Ġenter Frame Event Ġ= Ġfalse Ċ ĉ var Ġload Event Ġ= Ġfalse Ċ ĉ var Ġdrag Over Event Ġ= Ġfalse Ġ// ĠSW F 6 Ċ ĉ var Ġroll Out Event Ġ= Ġfalse Ġ// ĠSW F 6 Ċ ĉ var Ġroll Over Event Ġ= Ġfalse Ġ// ĠSW F 6 Ċ ĉ var Ġrelease Outside Event Ġ= Ġfalse Ġ// ĠSW F 6 Ċ ĉ var Ġrelease Event Ġ= Ġfalse Ġ// ĠSW F 6 Ċ ĉ var Ġpress Event Ġ= Ġfalse Ġ// ĠSW F 6 Ċ ĉ var Ġinitialize Event Ġ= Ġfalse Ġ// ĠSW F 6 Ċ ĉ var Ġdata Event Ġ= Ġfalse Ċ ĉ var Ġconstruct Event Ġ= Ġfalse Ġ// ĠSW F 7 Ċ ĉ var Ġkey Press Event Ġ= Ġfalse Ġ// ĠSW F 6 Ċ ĉ var Ġdrag Out Event Ġ= Ġfalse Ġ// ĠSW F 6 ĊĊ ĉ fun Ġparse ( data : ĠSW F Data , Ġversion : ĠInt ) Ġ{ Ċĉ ĉ val Ġflags 1 : ĠInt Ġ= Ġdata . read UI 8 () Ċĉ ĉ key Up Event Ġ= Ġ(( flags 1 Ġand Ġ 0 x 8 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ key Down Event Ġ= Ġ(( flags 1 Ġand Ġ 0 x 4 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ mouse Up Event Ġ= Ġ(( flags 1 Ġand Ġ 0 x 2 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ mouse Down Event Ġ= Ġ(( flags 1 Ġand Ġ 0 x 1 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ mouse Move Event Ġ= Ġ(( flags 1 Ġand Ġ 0 x 0 8 ) Ġ!= Ġ 0 ) Ċĉ ĉ unload Event Ġ= Ġ(( flags 1 Ġand Ġ 0 x 0 4 ) Ġ!= Ġ 0 ) Ċĉ ĉ enter Frame Event Ġ= Ġ(( flags 1 Ġand Ġ 0 x 0 2 ) Ġ!= Ġ 0 ) Ċĉ ĉ load Event Ġ= Ġ(( flags 1 Ġand Ġ 0 x 0 1 ) Ġ!= Ġ 0 ) Ċĉ ĉ val Ġflags 2 : ĠInt Ġ= Ġdata . read UI 8 () Ċĉ ĉ drag Over Event Ġ= Ġ(( flags 2 Ġand Ġ 0 x 8 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ roll Out Event Ġ= Ġ(( flags 2 Ġand Ġ 0 x 4 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ roll Over Event Ġ= Ġ(( flags 2 Ġand Ġ 0 x 2 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ release Outside Event Ġ= Ġ(( flags 2 Ġand Ġ 0 x 1 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ release Event Ġ= Ġ(( flags 2 Ġand Ġ 0 x 0 8 ) Ġ!= Ġ 0 ) Ċĉ ĉ press Event Ġ= Ġ(( flags 2 Ġand Ġ 0 x 0 4 ) Ġ!= Ġ 0 ) Ċĉ ĉ initialize Event Ġ= Ġ(( flags 2 Ġand Ġ 0 x 0 2 ) Ġ!= Ġ 0 ) Ċĉ ĉ data Event Ġ= Ġ(( flags 2 Ġand Ġ 0 x 0 1 ) Ġ!= Ġ 0 ) Ċĉ ĉ if Ġ( version Ġ>= Ġ 6 ) Ġ{ Ċĉĉ ĉ val Ġflags 3 : ĠInt Ġ= Ġdata . read UI 8 () Ċĉĉ ĉ construct Event Ġ= Ġ(( flags 3 Ġand Ġ 0 x 0 4 ) Ġ!= Ġ 0 ) Ċĉĉ ĉ key Press Event Ġ= Ġ(( flags 3 Ġand Ġ 0 x 0 2 ) Ġ!= Ġ 0 ) Ċĉĉ ĉ drag Out Event Ġ= Ġ(( flags 3 Ġand Ġ 0 x 0 1 ) Ġ!= Ġ 0 ) Ċĉĉ ĉ data . read UI 8 () Ġ// Ġreserved , Ġalways Ġ 0 Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ val Ġa Ġ= Ġarray ListOf < String >() Ċĉ ĉ if Ġ( key Up Event ) Ġa . add (" keyup ") Ċĉ ĉ if Ġ( key Down Event ) Ġa . add (" keydown ") Ċĉ ĉ if Ġ( mouse Up Event ) Ġa . add (" mouseup ") Ċĉ ĉ if Ġ( mouse Down Event ) Ġa . add (" mousedown ") Ċĉ ĉ if Ġ( mouse Move Event ) Ġa . add (" mousemove ") Ċĉ ĉ if Ġ( unload Event ) Ġa . add (" unload ") Ċĉ ĉ if Ġ( enter Frame Event ) Ġa . add (" enter frame ") Ċĉ ĉ if Ġ( load Event ) Ġa . add (" load ") Ċĉ ĉ if Ġ( drag Over Event ) Ġa . add (" drag over ") Ċĉ ĉ if Ġ( roll Out Event ) Ġa . add (" rol lout ") Ċĉ ĉ if Ġ( roll Over Event ) Ġa . add (" rol lover ") Ċĉ ĉ if Ġ( release Outside Event ) Ġa . add (" release outside ") Ċĉ ĉ if Ġ( release Event ) Ġa . add (" release ") Ċĉ ĉ if Ġ( press Event ) Ġa . add (" press ") Ċĉ ĉ if Ġ( initialize Event ) Ġa . add (" initialize ") Ċĉ ĉ if Ġ( data Event ) Ġa . add (" data ") Ċĉ ĉ if Ġ( construct Event ) Ġa . add (" construct ") Ċĉ ĉ if Ġ( key Press Event ) Ġa . add (" keypress ") Ċĉ ĉ if Ġ( drag Out Event ) Ġa . add (" drag out ") Ċĉ ĉ return Ġa . join ToString (",") Ċ ĉ } Ċ } Ċ Ċ open Ġclass ĠSW F Color Transform Ġ{ Ċ ĉ protected Ġvar Ġ_ r Mult Ġ= Ġ 2 5 6 Ċ ĉ protected Ġvar Ġ_ g Mult Ġ= Ġ 2 5 6 Ċ ĉ protected Ġvar Ġ_ b Mult Ġ= Ġ 2 5 6 Ċ ĉ protected Ġvar Ġ_ a Mult Ġ= Ġ 2 5 6 ĊĊ ĉ protected Ġvar Ġ_ r Add Ġ= Ġ 0 Ċ ĉ protected Ġvar Ġ_ g Add Ġ= Ġ 0 Ċ ĉ protected Ġvar Ġ_ b Add Ġ= Ġ 0 Ċ ĉ protected Ġvar Ġ_ a Add Ġ= Ġ 0 ĊĊ ĉ var Ġhas Mult Terms Ġ= Ġfalse Ċ ĉ var Ġhas Add Terms Ġ= Ġfalse ĊĊ ĉ var Ġr Mult : ĠDouble Ċĉ ĉ get () Ġ= Ġ(_ r Mult . toDouble () Ġ/ Ġ 2 5 6 ) Ċĉ ĉ set ( value ) Ġ= Ġrun Ġ{ Ċĉĉ ĉ _ r Mult Ġ= Ġclamp (( value Ġ* Ġ 2 5 6 ). toInt ()); Ġupdate Has Mult Terms () Ċĉ ĉ } Ċ ĉ var Ġg Mult : ĠDouble Ċĉ ĉ get () Ġ= Ġ(_ g Mult . toDouble () Ġ/ Ġ 2 5 6 ) Ċĉ ĉ set ( value ) Ġ= Ġrun Ġ{ Ċĉĉ ĉ _ g Mult Ġ= Ġclamp (( value Ġ* Ġ 2 5 6 ). toInt ()); Ġupdate Has Mult Terms () Ċĉ ĉ } Ċ ĉ var Ġb Mult : ĠDouble Ċĉ ĉ get () Ġ= Ġ(_ b Mult . toDouble () Ġ/ Ġ 2 5 6 ) Ċĉ ĉ set ( value ) Ġ= Ġrun Ġ{ Ċĉĉ ĉ _ b Mult Ġ= Ġclamp (( value Ġ* Ġ 2 5 6 ). toInt ()); Ġupdate Has Mult Terms () Ċĉ ĉ } Ċ ĉ open Ġvar Ġa Mult : ĠDouble Ċĉ ĉ get () Ġ= Ġ(_ a Mult . toDouble () Ġ/ Ġ 2 5 6 ) Ċĉ ĉ set ( value ) Ġ= Ġrun Ġ{ Ċĉĉ ĉ _ a Mult Ġ= Ġclamp (( value Ġ* Ġ 2 5 6 ). toInt ()); Ġupdate Has Mult Terms () Ċĉ ĉ } ĊĊ ĉ var Ġr Add : ĠInt Ġget () Ġ= Ġ_ r Add ; Ġset ( value ) Ġ= Ġrun Ġ{ Ġ_ r Add Ġ= Ġclamp ( value ); Ġupdate Has Add Terms () Ġ} Ċ ĉ var Ġg Add : ĠInt Ġget () Ġ= Ġ_ g Add ; Ġset ( value ) Ġ= Ġrun Ġ{ Ġ_ g Add Ġ= Ġclamp ( value ); Ġupdate Has Add Terms () Ġ} Ċ ĉ var Ġb Add : ĠInt Ġget () Ġ= Ġ_ b Add ; Ġset ( value ) Ġ= Ġrun Ġ{ Ġ_ b Add Ġ= Ġclamp ( value ); Ġupdate Has Add Terms () Ġ} Ċ ĉ open Ġvar Ġa Add : ĠInt Ġget () Ġ= Ġ_ a Add ; Ġset ( value ) Ġ= Ġrun Ġ{ Ġ_ a Add Ġ= Ġclamp ( value ); Ġupdate Has Add Terms () Ġ} ĊĊ ĉ open Ġfun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ data . reset Bits Pending () Ċĉ ĉ has Add Terms Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ has Mult Terms Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ val Ġbits Ġ= Ġdata . read UB ( 4 ) Ċĉ ĉ if Ġ( has Mult Terms ) Ġ{ Ċĉĉ ĉ _ r Mult Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ g Mult Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ b Mult Ġ= Ġdata . read SB ( bits ) Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ _ r Mult Ġ= Ġ 2 5 6 Ċĉĉ ĉ _ g Mult Ġ= Ġ 2 5 6 Ċĉĉ ĉ _ b Mult Ġ= Ġ 2 5 6 Ċĉ ĉ } Ċĉ ĉ if Ġ( has Add Terms ) Ġ{ Ċĉĉ ĉ _ r Add Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ g Add Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ b Add Ġ= Ġdata . read SB ( bits ) Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ _ r Add Ġ= Ġ 0 Ċĉĉ ĉ _ g Add Ġ= Ġ 0 Ċĉĉ ĉ _ b Add Ġ= Ġ 0 Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġopen Ġfun Ġupdate Has Mult Terms (): ĠUnit Ġ= Ċĉ ĉ run Ġ{ Ġhas Mult Terms Ġ= Ġ(_ r Mult Ġ!= Ġ 2 5 6 ) Ġ|| Ġ(_ g Mult Ġ!= Ġ 2 5 6 ) Ġ|| Ġ(_ b Mult Ġ!= Ġ 2 5 6 ) Ġ} ĊĊ ĉ protected Ġopen Ġfun Ġupdate Has Add Terms (): ĠUnit Ġ= Ġrun Ġ{ Ġhas Add Terms Ġ= Ġ(_ r Add Ġ!= Ġ 0 ) Ġ|| Ġ(_ g Add Ġ!= Ġ 0 ) Ġ|| Ġ(_ b Add Ġ!= Ġ 0 ) Ġ} ĊĊ ĉ protected Ġfun Ġclamp ( value : ĠInt ): ĠInt Ġ= Ġmin 2 ( max 2 ( value , Ġ- 3 2 7 6 8 ), Ġ 3 2 7 6 7 ) Ċ ĉ fun Ġis Identity (): ĠBoolean Ġ= Ġ! has Mult Terms Ġ&& Ġ! has Add Terms Ċ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ" ($ r Mult ,$ g Mult ,$ b Mult ,$ r Add ,$ g Add ,$ b Add )" Ċ } Ċ Ċ class ĠSW F Color Transform With Alpha Ġ: ĠSW F Color Transform () Ġ{ Ċ ĉ // override Ġvar Ġa Mult : ĠDouble Ġget () Ġ= Ġ_ a Mult . toDouble () Ġ/ Ġ 2 5 6 ; Ġset ( value ) Ġ= Ġrun Ġ{ Ġ_ a Mult Ġ= Ġclamp (( value Ġ* Ġ 2 5 6 ). toInt ()); Ġupdate Has Mult Terms () Ġ} Ċ ĉ // override Ġvar Ġa Add : ĠInt Ġget () Ġ= Ġ_ a Add ; Ġset ( value ) Ġ= Ġrun Ġ{ Ġ_ a Add Ġ= Ġclamp ( value ); Ġupdate Has Add Terms () Ġ} ĊĊ ĉ // override Ġval Ġcolor Transform : Ġflash . geom . Color Transform Ġget () Ġ= Ġflash . geom . Color Transform ( r Mult , Ġg Mult , Ġb Mult , Ġa Mult , Ġr Add , Ġg Add , Ġb Add , Ġa Add ) ĊĊ ĉ override Ġfun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ data . reset Bits Pending () Ċĉ ĉ has Add Terms Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ has Mult Terms Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ val Ġbits : ĠInt Ġ= Ġdata . read UB ( 4 ) Ċĉ ĉ if Ġ( has Mult Terms ) Ġ{ Ċĉĉ ĉ _ r Mult Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ g Mult Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ b Mult Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ a Mult Ġ= Ġdata . read SB ( bits ) Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ _ r Mult Ġ= Ġ 2 5 6 Ċĉĉ ĉ _ g Mult Ġ= Ġ 2 5 6 Ċĉĉ ĉ _ b Mult Ġ= Ġ 2 5 6 Ċĉĉ ĉ _ a Mult Ġ= Ġ 2 5 6 Ċĉ ĉ } Ċĉ ĉ if Ġ( has Add Terms ) Ġ{ Ċĉĉ ĉ _ r Add Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ g Add Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ b Add Ġ= Ġdata . read SB ( bits ) Ċĉĉ ĉ _ a Add Ġ= Ġdata . read SB ( bits ) Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ _ r Add Ġ= Ġ 0 Ċĉĉ ĉ _ g Add Ġ= Ġ 0 Ċĉĉ ĉ _ b Add Ġ= Ġ 0 Ċĉĉ ĉ _ a Add Ġ= Ġ 0 Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġupdate Has Mult Terms (): ĠUnit Ġ= Ċĉ ĉ run Ġ{ Ġhas Mult Terms Ġ= Ġ(_ r Mult Ġ!= Ġ 2 5 6 ) Ġ|| Ġ(_ g Mult Ġ!= Ġ 2 5 6 ) Ġ|| Ġ(_ b Mult Ġ!= Ġ 2 5 6 ) Ġ|| Ġ(_ a Mult Ġ!= Ġ 2 5 6 ) Ġ} ĊĊ ĉ override Ġfun Ġupdate Has Add Terms (): ĠUnit Ġ= Ċĉ ĉ run Ġ{ Ġhas Add Terms Ġ= Ġ(_ r Add Ġ!= Ġ 0 ) Ġ|| Ġ(_ g Add Ġ!= Ġ 0 ) Ġ|| Ġ(_ b Add Ġ!= Ġ 0 ) Ġ|| Ġ(_ a Add Ġ!= Ġ 0 ) Ġ} ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ" ($ r Mult ,$ g Mult ,$ b Mult ,$ a Mult ,$ r Add ,$ g Add ,$ b Add ,$ a Add )" Ċ } Ċ Ċ class ĠSW FF ill Style Ġ{ Ċ ĉ var Ġtype : ĠInt Ġ= Ġ 0 ĊĊ ĉ var Ġrgb : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġgradient : ĠSW F Gradient ? Ġ= Ġnull Ċ ĉ var Ġgradient Matrix : ĠSW F Matrix ? Ġ= Ġnull Ċ ĉ var Ġbitmap Id : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġbitmap Matrix : ĠSW F Matrix ? Ġ= Ġnull ĊĊ ĉ protected Ġvar Ġ_ level : ĠInt Ġ= Ġ 0 ĊĊ ĉ fun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt Ġ= Ġ 1 ) Ġ{ Ċĉ ĉ _ level Ġ= Ġlevel Ċĉ ĉ type Ġ= Ġdata . read UI 8 () Ċĉ ĉ when Ġ( type ) Ġ{ Ċĉĉĉ 0 x 0 0 Ġ-> Ġ{ Ċĉĉĉ ĉ rgb Ġ= Ġif Ġ( level Ġ<= Ġ 2 ) Ġdata . read RGB () Ġelse Ġdata . read RGBA () Ċĉĉ ĉ } Ċĉĉĉ 0 x 1 0 , Ġ 0 x 1 2 , Ġ 0 x 1 3 Ġ-> Ġ{ Ċĉĉĉ ĉ gradient Matrix Ġ= Ġdata . read MATRIX () Ċĉĉĉ ĉ gradient Ġ= Ġif Ġ( type Ġ== Ġ 0 x 1 3 ) Ġdata . read FO CAL GRAD IENT ( level ) Ġelse Ġdata . read GRAD IENT ( level ) Ċĉĉ ĉ } Ċĉĉĉ 0 x 4 0 , Ġ 0 x 4 1 , Ġ 0 x 4 2 , Ġ 0 x 4 3 Ġ-> Ġ{ Ċĉĉĉ ĉ bitmap Id Ġ= Ġdata . read UI 1 6 () Ċĉĉĉ ĉ bitmap Matrix Ġ= Ġdata . read MATRIX () Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> Ġthrow ĠError (" Unknown Ġfill Ġstyle Ġtype : Ġ 0 x ${ type . toString ( 1 6 )} ") Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ var Ġstr : ĠString Ġ= Ġ"[ SW FF ill Style ] ĠType : Ġ" Ġ+ Ġ"% 0 2 x ". format ( type ) Ċĉ ĉ when Ġ( type ) Ġ{ Ċĉĉĉ 0 x 0 0 Ġ-> Ġstr Ġ+= Ġ" Ġ( solid ), ĠColor : Ġ" Ġ+ Ġ( if Ġ(_ level Ġ<= Ġ 2 ) ĠColor Utils . rgb ToString ( rgb ) Ġelse ĠColor Utils . rgba ToString ( Ċĉĉĉ ĉ rgb Ċĉĉ ĉ )) Ċĉĉĉ 0 x 1 0 Ġ-> Ġstr Ġ+= Ġ" Ġ( linear Ġgradient ), ĠGradient : Ġ$ gradient , ĠMatrix : Ġ$ gradient Matrix " Ċĉĉĉ 0 x 1 2 Ġ-> Ġstr Ġ+= Ġ" Ġ( radial Ġgradient ), ĠGradient : Ġ$ gradient , ĠMatrix : Ġ$ gradient Matrix " Ċĉĉĉ 0 x 1 3 Ġ-> Ġstr Ġ+= Ġ" Ġ( focal Ġradial Ġgradient ), ĠGradient : Ġ$ gradient , ĠMatrix : Ġ$ gradient Matrix , ĠF ocal Point : Ġ${ gradient ?. focal Point }" Ċĉĉĉ 0 x 4 0 Ġ-> Ġstr Ġ+= Ġ" Ġ( repe ating Ġbitmap ), ĠBitmap ID : Ġ$ bitmap Id " Ċĉĉĉ 0 x 4 1 Ġ-> Ġstr Ġ+= Ġ" Ġ( cli pped Ġbitmap ), ĠBitmap ID : Ġ$ bitmap Id " Ċĉĉĉ 0 x 4 2 Ġ-> Ġstr Ġ+= Ġ" Ġ( non - smo ot hed Ġrepe ating Ġbitmap ), ĠBitmap ID : Ġ$ bitmap Id " Ċĉĉĉ 0 x 4 3 Ġ-> Ġstr Ġ+= Ġ" Ġ( non - smo ot hed Ġcli pped Ġbitmap ), ĠBitmap ID : Ġ$ bitmap Id " Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } Ċ } Ċ Ċ class ĠSW FF ocal Gradient Ġ: ĠSW F Gradient () Ġ{ Ċ ĉ override Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ super . parse ( data , Ġlevel ) Ċĉ ĉ focal Point Ġ= Ġdata . read FIXED 8 () Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ"(" Ġ+ Ġrecords . join ToString (",") Ġ+ Ġ")" Ċ } Ċ Ċ class ĠSW FF rame Label ( var Ġframe Number : ĠInt , Ġvar Ġname : ĠString ) Ġ{ Ċ ĉ override Ġfun ĠtoString () Ġ= Ġ" Frame : Ġ$ frame Number , ĠName : Ġ$ name " Ċ } Ċ Ċ class ĠSW FG lyph Entry Ġ{ Ċ ĉ var Ġindex : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġadvance : ĠInt Ġ= Ġ 0 ĊĊ ĉ fun Ġparse ( data : ĠSW F Data , Ġglyph Bits : ĠInt , Ġadvance Bits : ĠInt ) Ġ{ Ċĉ ĉ // ĠGL YP HEN TRY s Ġare Ġnot Ġbyte Ġaligned Ċĉ ĉ index Ġ= Ġdata . read UB ( glyph Bits ) Ċĉ ĉ advance Ġ= Ġdata . read SB ( advance Bits ) Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ"[ SW FG lyph Entry ] ĠIndex : Ġ" Ġ+ Ġindex . toString () Ġ+ Ġ", ĠAdv ance : Ġ" Ġ+ Ġadvance . toString () Ċ } Ċ Ċ open Ġclass ĠSW F Gradient Ġ{ Ċ ĉ var Ġspread Mode : ĠGradient Spread Mode Ġ= ĠGradient Spread Mode . PAD Ċ ĉ var Ġinterpolation Mode : ĠGradient Interpolation Mode Ġ= ĠGradient Interpolation Mode . NORMAL ĊĊ ĉ // ĠForward Ġdeclarations Ġof Ġproperties Ġin ĠSW FF ocal Gradient Ċ ĉ var Ġf ocal Point : ĠDouble Ġ= Ġ 0 . 0 ĊĊ ĉ var Ġrecords Ġ= ĠArrayList < SW F Gradient Record >() ĊĊ ĉ open Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ data . reset Bits Pending () Ċĉ ĉ spread Mode Ġ= ĠGradient Spread Mode [ data . read UB ( 2 )] Ċĉ ĉ interpolation Mode Ġ= ĠGradient Interpolation Mode [ data . read UB ( 2 )] Ċĉ ĉ val Ġnum Grad ients : ĠInt Ġ= Ġdata . read UB ( 4 ) Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġnum Grad ients ) Ġrecords . add ( data . read GRAD IENT RECORD ( level )) Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ċĉ ĉ " (${ records . join ToString (",") }), ĠSp read Mode : Ġ$ spread Mode , ĠInterpol ation Mode : Ġ$ interpolation Mode " Ċ } Ċ Ċ class ĠSW F Gradient Record Ġ{ Ċ ĉ var Ġratio : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġcolor : ĠInt Ġ= Ġ 0 ĊĊ ĉ protected Ġvar Ġ_ level : ĠInt Ġ= Ġ 0 ĊĊ ĉ fun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ _ level Ġ= Ġlevel Ċĉ ĉ ratio Ġ= Ġdata . read UI 8 () Ċĉ ĉ color Ġ= Ġif Ġ( level Ġ<= Ġ 2 ) Ġdata . read RGB () Ġelse Ġdata . read RGBA () Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ċĉ ĉ " [" Ġ+ Ġratio Ġ+ Ġ"," Ġ+ Ġ( if Ġ(_ level Ġ<= Ġ 2 ) ĠColor Utils . rgb ToString ( color ) Ġelse ĠColor Utils . rgba ToString ( color )) Ġ+ Ġ" ]" Ċ } Ċ Ċ class ĠSW FK er ning Record Ġ{ Ċ ĉ var Ġcode 1 : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġcode 2 : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġadjustment : ĠInt Ġ= Ġ 0 ĊĊ ĉ fun Ġparse ( data : ĠSW F Data , Ġwide Codes : ĠBoolean ) Ġ{ Ċĉ ĉ code 1 Ġ= Ġif Ġ( wide Codes ) Ġdata . read UI 1 6 () Ġelse Ġdata . read UI 8 () Ċĉ ĉ code 2 Ġ= Ġif Ġ( wide Codes ) Ġdata . read UI 1 6 () Ġelse Ġdata . read UI 8 () Ċĉ ĉ adjust ment Ġ= Ġdata . read SI 1 6 () Ċ ĉ } ĊĊ ĉ fun ĠtoString ( indent : ĠInt Ġ= Ġ 0 ): ĠString Ġ= Ġ" Code 1 : Ġ$ code 1 , ĠCode 2 : Ġ$ code 2 , ĠAdjust ment : Ġ$ adjust ment " Ċ } Ċ Ċ open Ġclass ĠSW F Line Style Ġ{ Ċ ĉ var Ġwidth : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġcolor : ĠInt Ġ= Ġ 0 ĊĊ ĉ var Ġ_ level : ĠInt Ġ= Ġ 0 ĊĊ ĉ // ĠForward Ġdeclaration Ġof ĠSW F Line Style 2 Ġproperties Ċ ĉ var Ġstart Caps Style : ĠLine Caps Style Ġ= ĠLine Caps Style . ROUND Ċ ĉ var Ġend Caps Style : ĠLine Caps Style Ġ= ĠLine Caps Style . ROUND Ċ ĉ var Ġjoint Style : ĠInt Ġ= ĠLine Joint Style . ROUND Ċ ĉ var Ġhas Fill Flag : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġno H Scale Flag : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġno V Scale Flag : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġpixel Hint ing Flag : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġno Close : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġm iter Limit Factor : ĠDouble Ġ= Ġ 3 . 0 Ċ ĉ var Ġfill Type : ĠSW FF ill Style ? Ġ= Ġnull ĊĊ ĉ open Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt Ġ= Ġ 1 ) Ġ{ Ċĉ ĉ _ level Ġ= Ġlevel Ċĉ ĉ width Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ color Ġ= Ġif Ġ( level Ġ<= Ġ 2 ) Ġdata . read RGB () Ġelse Ġdata . read RGBA () Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ċĉ ĉ "[ SW F Line Style ] ĠWidth : Ġ$ width ĠColor : Ġ" Ġ+ Ċĉĉĉ ĉ ( if Ġ(_ level Ġ<= Ġ 2 ) ĠColor Utils . rgb ToString ( color ) Ġelse ĠColor Utils . rgba ToString ( color )) Ċ } Ċ Ċ class ĠSW F Line Style 2 Ġ: ĠSW F Line Style () Ġ{ Ċ ĉ override Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ width Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ start Caps Style Ġ= ĠLine Caps Style [ data . read UB ( 2 )] Ċĉ ĉ joint Style Ġ= Ġdata . read UB ( 2 ) Ċĉ ĉ has Fill Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ no H Scale Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ no V Scale Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ pixel Hint ing Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ data . read UB ( 5 ) Ċĉ ĉ no Close Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ end Caps Style Ġ= ĠLine Caps Style [ data . read UB ( 2 )] Ċĉ ĉ if Ġ( joint Style Ġ== ĠLine Joint Style . MIT ER ) Ġm iter Limit Factor Ġ= Ġdata . read FIXED 8 () Ċĉ ĉ if Ġ( has Fill Flag ) Ġ{ Ċĉĉ ĉ fill Type Ġ= Ġdata . read FILL STYLE ( level ) Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ color Ġ= Ġdata . read RGBA () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ var Ġstr : ĠString Ġ= Ġ"[ SW F Line Style 2 ] ĠWidth : Ġ" Ġ+ Ġwidth Ġ+ Ġ", Ġ" Ġ+ Ċĉĉĉ ĉ " Start Caps : Ġ" Ġ+ Ġ( start Caps Style ) Ġ+ Ġ", Ġ" Ġ+ Ċĉĉĉ ĉ " End Caps : Ġ" Ġ+ Ġ( end Caps Style ) Ġ+ Ġ", Ġ" Ġ+ Ċĉĉĉ ĉ " Joint : Ġ" Ġ+ ĠLine Joint Style . toString ( joint Style ) Ġ+ Ġ", Ġ" Ċĉ ĉ if Ġ( no Close ) Ġstr Ġ+= Ġ" No Close , Ġ" Ċĉ ĉ if Ġ( no H Scale Flag ) Ġstr Ġ+= Ġ" No H Scale , Ġ" Ċĉ ĉ if Ġ( no V Scale Flag ) Ġstr Ġ+= Ġ" No V Scale , Ġ" Ċĉ ĉ if Ġ( pixel Hint ing Flag ) Ġstr Ġ+= Ġ" Pixel Hint ing , Ġ" Ċĉ ĉ if Ġ( has Fill Flag ) Ġ{ Ċĉĉ ĉ str Ġ+= Ġ" Fill : Ġ" Ġ+ Ġfill Type . toString () Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ str Ġ+= Ġ" Color : Ġ" Ġ+ ĠColor Utils . rgba ToString ( color ) Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } Ċ } Ċ Ċ class ĠSW F Matrix Ġ{ Ċ ĉ var Ġscale X : ĠDouble Ġ= Ġ 1 . 0 Ċ ĉ var Ġscale Y : ĠDouble Ġ= Ġ 1 . 0 Ċ ĉ var Ġrotate Sk ew 0 : ĠDouble Ġ= Ġ 0 . 0 Ċ ĉ var Ġrotate Sk ew 1 : ĠDouble Ġ= Ġ 0 . 0 Ċ ĉ var ĠtranslateX : ĠInt Ġ= Ġ 0 Ċ ĉ var ĠtranslateY : ĠInt Ġ= Ġ 0 ĊĊ ĉ var Ġx scale : ĠDouble Ġ= Ġ 0 . 0 Ċ ĉ var Ġy scale : ĠDouble Ġ= Ġ 0 . 0 Ċ ĉ var Ġrotation : ĠDouble Ġ= Ġ 0 . 0 ĊĊ ĉ val Ġmatrix : ĠMatrix Ċĉ ĉ get () Ġ= ĠMatrix ( Ċĉĉ ĉ scale X , Ċĉĉ ĉ rotate Sk ew 0 , Ċĉĉ ĉ rotate Sk ew 1 , Ċĉĉ ĉ scale Y , Ċĉĉ ĉ translate X . toDouble () Ġ/ Ġ 2 0 . 0 , Ċĉĉ ĉ translate Y . toDouble () Ġ/ Ġ 2 0 . 0 Ċĉ ĉ ) ĊĊ ĉ fun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ data . reset Bits Pending () Ċĉ ĉ scale X Ġ= Ġ 1 . 0 Ċĉ ĉ scale Y Ġ= Ġ 1 . 0 Ċĉ ĉ if Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ġ{ Ċĉĉ ĉ val Ġscale Bits Ġ= Ġdata . read UB ( 5 ) Ċĉĉ ĉ scale X Ġ= Ġdata . read FB ( scale Bits ) Ċĉĉ ĉ scale Y Ġ= Ġdata . read FB ( scale Bits ) Ċĉ ĉ } Ċĉ ĉ rotate Sk ew 0 Ġ= Ġ 0 . 0 Ċĉ ĉ rotate Sk ew 1 Ġ= Ġ 0 . 0 Ċĉ ĉ if Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ġ{ Ċĉĉ ĉ val Ġrotate Bits Ġ= Ġdata . read UB ( 5 ) Ċĉĉ ĉ rotate Sk ew 0 Ġ= Ġdata . read FB ( rotate Bits ) Ċĉĉ ĉ rotate Sk ew 1 Ġ= Ġdata . read FB ( rotate Bits ) Ċĉ ĉ } Ċĉ ĉ val Ġtranslate Bits Ġ= Ġdata . read UB ( 5 ) Ċĉ ĉ translate X Ġ= Ġdata . read SB ( translate Bits ) Ċĉ ĉ translate Y Ġ= Ġdata . read SB ( translate Bits ) Ċĉ ĉ // Ġconversion Ġto Ġrotation , Ġx scale , Ġy scale Ċĉ ĉ val Ġpx Ġ= Ġmatrix . delta Transform Point ( I Point ( 0 . 0 , Ġ 1 . 0 )) Ċĉ ĉ rotation Ġ= Ġ(( 1 8 0 Ġ/ ĠPI ) Ġ* Ġatan 2 ( px . y , Ġpx . x ) Ġ- Ġ 9 0 ) Ċĉ ĉ if Ġ( rotation Ġ< Ġ 0 ) Ġrotation Ġ+= Ġ 3 6 0 Ċĉ ĉ x scale Ġ= Ġsqrt ( scale X Ġ* Ġscale X Ġ+ Ġrotate Sk ew 0 Ġ* Ġrotate Sk ew 0 ) Ċĉ ĉ y scale Ġ= Ġsqrt ( rotate Sk ew 1 Ġ* Ġrotate Sk ew 1 Ġ+ Ġscale Y Ġ* Ġscale Y ) Ċ ĉ } ĊĊ ĉ fun Ġis Identity (): ĠBoolean Ġ= Ċĉ ĉ ( scale X Ġ== Ġ 1 . 0 Ġ&& Ġscale Y Ġ== Ġ 1 . 0 Ġ&& Ġrotate Sk ew 0 Ġ== Ġ 0 . 0 Ġ&& Ġrotate Sk ew 1 Ġ== Ġ 0 . 0 Ġ&& ĠtranslateX Ġ== Ġ 0 Ġ&& ĠtranslateY Ġ== Ġ 0 ) ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ" ($ scale X ,$ rotate Sk ew 0 ,$ rotate Sk ew 1 ,$ scale Y ,$ translate X ,$ translate Y )" Ċ } Ċ Ċ class ĠSW FM orph Fill Style Ġ{ Ċ ĉ var Ġtype : ĠInt Ġ= Ġ 0 ĊĊ ĉ var Ġstart Color : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġend Color : ĠInt Ġ= Ġ 0 Ċ ĉ late init Ġvar Ġstart Gradient Matrix : ĠSW F Matrix Ċ ĉ late init Ġvar Ġend Gradient Matrix : ĠSW F Matrix Ċ ĉ var Ġgradient : ĠSW FM orph Gradient ? Ġ= Ġnull Ċ ĉ var Ġbitmap Id : ĠInt Ġ= Ġ 0 Ċ ĉ late init Ġvar Ġstart Bitmap Matrix : ĠSW F Matrix Ċ ĉ late init Ġvar Ġend Bitmap Matrix : ĠSW F Matrix ĊĊ ĉ fun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt Ġ= Ġ 1 ) Ġ{ Ċĉ ĉ type Ġ= Ġdata . read UI 8 () Ċĉ ĉ when Ġ( type ) Ġ{ Ċĉĉĉ 0 x 0 0 Ġ-> Ġ{ Ċĉĉĉ ĉ start Color Ġ= Ġdata . read RGBA () Ċĉĉĉ ĉ end Color Ġ= Ġdata . read RGBA () Ċĉĉ ĉ } Ċĉĉĉ 0 x 1 0 , Ġ 0 x 1 2 , Ġ 0 x 1 3 Ġ-> Ġ{ Ċĉĉĉ ĉ start Gradient Matrix Ġ= Ġdata . read MATRIX () Ċĉĉĉ ĉ end Gradient Matrix Ġ= Ġdata . read MATRIX () Ċĉĉĉ ĉ gradient Ġ= Ġif Ġ( type Ġ== Ġ 0 x 1 3 ) Ġdata . read MOR PH FO CAL GRAD IENT ( level ) Ġelse Ġdata . read MOR PH GRAD IENT ( level ) Ċĉĉ ĉ } Ċĉĉĉ 0 x 4 0 , Ġ 0 x 4 1 , Ġ 0 x 4 2 , Ġ 0 x 4 3 Ġ-> Ġ{ Ċĉĉĉ ĉ bitmap Id Ġ= Ġdata . read UI 1 6 () Ċĉĉĉ ĉ start Bitmap Matrix Ġ= Ġdata . read MATRIX () Ċĉĉĉ ĉ end Bitmap Matrix Ġ= Ġdata . read MATRIX () Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉ ĉ throw ( Error (" Unknown Ġfill Ġstyle Ġtype : Ġ 0 x " Ġ+ Ġtype . toString ( 1 6 ))) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġget M orp hed Fill Style ( ratio : ĠDouble ): ĠSW FF ill Style Ġ{ Ċĉ ĉ val Ġfill Style Ġ= ĠSW FF ill Style () Ċĉ ĉ fillStyle . type Ġ= Ġtype Ċĉ ĉ when Ġ( type ) Ġ{ Ċĉĉĉ 0 x 0 0 Ġ-> Ġfill Style . rgb Ġ= ĠColor Utils . interpolate ( start Color , Ġend Color , Ġratio ) Ċĉĉĉ 0 x 1 0 , Ġ 0 x 1 2 Ġ-> Ġ{ Ċĉĉĉ ĉ fillStyle . gradient Matrix Ġ= ĠMatrix Utils . interpolate ( start Gradient Matrix , Ġend Gradient Matrix , Ġratio ) Ċĉĉĉ ĉ fillStyle . gradient Ġ= Ġgradient !!. getM orp hed Gradient ( ratio ) Ċĉĉ ĉ } Ċĉĉĉ 0 x 4 0 , Ġ 0 x 4 1 , Ġ 0 x 4 2 , Ġ 0 x 4 3 Ġ-> Ġ{ Ċĉĉĉ ĉ fillStyle . bitmap Id Ġ= Ġbitmap Id Ċĉĉĉ ĉ fillStyle . bitmap Matrix Ġ= ĠMatrix Utils . interpolate ( start Bitmap Matrix , Ġend Bitmap Matrix , Ġratio ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġfill Style Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ return Ġ"[ SW FM orph Fill Style ] ĠType : Ġ" Ġ+ Ġtype . toString ( 1 6 ) Ġ+ Ġwhen Ġ( type ) Ġ{ Ċĉĉĉ 0 x 0 0 Ġ-> Ġ" Ġ( solid ), ĠStart Color : Ġ" Ġ+ ĠColor Utils . rgba ToString ( start Color ) Ġ+ Ġ", ĠEnd Color : Ġ" Ġ+ ĠColor Utils . rgba ToString ( Ċĉĉĉ ĉ end Color Ċĉĉ ĉ ) Ċĉĉĉ 0 x 1 0 Ġ-> Ġ" Ġ( linear Ġgradient ), ĠGradient : Ġ$ gradient " Ċĉĉĉ 0 x 1 2 Ġ-> Ġ" Ġ( radial Ġgradient ), ĠGradient : Ġ$ gradient " Ċĉĉĉ 0 x 1 3 Ġ-> Ġ" Ġ( focal Ġradial Ġgradient ), ĠGradient : Ġ$ gradient " Ċĉĉĉ 0 x 4 0 Ġ-> Ġ" Ġ( repe ating Ġbitmap ), ĠBitmap ID : Ġ$ bitmap Id " Ċĉĉĉ 0 x 4 1 Ġ-> Ġ" Ġ( cli pped Ġbitmap ), ĠBitmap ID : Ġ$ bitmap Id " Ċĉĉĉ 0 x 4 2 Ġ-> Ġ" Ġ( non - smo ot hed Ġrepe ating Ġbitmap ), ĠBitmap ID : Ġ$ bitmap Id " Ċĉĉĉ 0 x 4 3 Ġ-> Ġ" Ġ( non - smo ot hed Ġcli pped Ġbitmap ), ĠBitmap ID : Ġ$ bitmap Id " Ċĉĉ ĉ else Ġ-> Ġ"" Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ class ĠSW FM orph F ocal Gradient Ġ: ĠSW FM orph Gradient () Ġ{ Ċ ĉ override Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ super . parse ( data , Ġlevel ) Ċĉ ĉ start F ocal Point Ġ= Ġdata . read FIXED 8 () Ċĉ ĉ end F ocal Point Ġ= Ġdata . read FIXED 8 () Ċ ĉ } ĊĊ ĉ override Ġfun Ġget M orp hed Gradient ( ratio : ĠDouble ): ĠSW F Gradient Ġ{ Ċĉ ĉ val Ġgradient Ġ= ĠSW F Gradient () Ċĉ ĉ // ĠTODO : Ġf ocal Point Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġrecords . size ) Ġ{ Ċĉĉ ĉ gradient . records . add ( records [ i ]. getM orp hed Gradient Record ( ratio )) Ċĉ ĉ } Ċĉ ĉ return Ġgradient Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ return Ġ" F ocal Point : Ġ" Ġ+ Ġstart F ocal Point Ġ+ Ġ"," Ġ+ Ġend F ocal Point Ġ+ Ġ" Ġ(" Ġ+ Ġrecords . join ToString (",") Ġ+ Ġ")" Ċ ĉ } Ċ } Ċ Ċ open Ġclass ĠSW FM orph Gradient Ġ{ Ċ ĉ var Ġspread Mode : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġinterpolation Mode : ĠInt Ġ= Ġ 0 ĊĊ ĉ // ĠForward Ġdeclarations Ġof Ġproperties Ġin ĠSW FM orph F ocal Gradient Ċ ĉ var Ġstart F ocal Point : ĠDouble Ġ= Ġ 0 . 0 Ċ ĉ var Ġend F ocal Point : ĠDouble Ġ= Ġ 0 . 0 ĊĊ ĉ protected Ġvar Ġrecords Ġ= ĠArrayList < SW FM orph Gradient Record >() ĊĊ ĉ open Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ data . reset Bits Pending () Ċĉ ĉ spread Mode Ġ= Ġdata . read UB ( 2 ) Ċĉ ĉ interpolation Mode Ġ= Ġdata . read UB ( 2 ) Ċĉ ĉ val Ġnum Grad ients : ĠInt Ġ= Ġdata . read UB ( 4 ) Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġnum Grad ients ) Ġ{ Ċĉĉ ĉ records . add ( data . read MOR PH GRAD IENT RECORD ()) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ open Ġfun Ġget M orp hed Gradient ( ratio : ĠDouble Ġ= Ġ 0 . 0 ): ĠSW F Gradient Ġ{ Ċĉ ĉ val Ġgradient Ġ= ĠSW F Gradient () Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġrecords . size ) Ġ{ Ċĉĉ ĉ gradient . records . add ( records [ i ]. getM orp hed Gradient Record ( ratio )) Ċĉ ĉ } Ċĉ ĉ return Ġgradient Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ return Ġ"(" Ġ+ Ġrecords . join ToString (",") Ġ+ Ġ"), Ġspread :" Ġ+ Ġspread Mode Ġ+ Ġ", Ġinterpolation :" Ġ+ Ġinterpolation Mode Ċ ĉ } Ċ } Ċ Ċ class ĠSW FM orph Gradient Record Ġ{ Ċ ĉ var Ġstart Ratio : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġstart Color : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġend Ratio : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġend Color : ĠInt Ġ= Ġ 0 ĊĊ ĉ fun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ start Ratio Ġ= Ġdata . read UI 8 () Ċĉ ĉ start Color Ġ= Ġdata . read RGBA () Ċĉ ĉ end Ratio Ġ= Ġdata . read UI 8 () Ċĉ ĉ end Color Ġ= Ġdata . read RGBA () Ċ ĉ } ĊĊ ĉ fun Ġget M orp hed Gradient Record ( ratio : ĠDouble Ġ= Ġ 0 . 0 ): ĠSW F Gradient Record Ġ{ Ċĉ ĉ val Ġgradient Record Ġ= ĠSW F Gradient Record () Ċĉ ĉ gradient Record . color Ġ= ĠColor Utils . interpolate ( start Color , Ġend Color , Ġratio ) Ċĉ ĉ gradient Record . ratio Ġ= Ġ( start Ratio Ġ+ Ġ( end Ratio Ġ- Ġstart Ratio ) Ġ* Ġratio ). toInt () Ċĉ ĉ return Ġgradient Record Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ċĉ ĉ " [$ start Ratio , ${ Color Utils . rgba ToString ( start Color )}, $ end Ratio , ${ Color Utils . rgba ToString ( end Color )} ]" Ċ } Ċ Ċ open Ġclass ĠSW FM orph Line Style Ġ{ Ċ ĉ var Ġstart Width : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġend Width : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġstart Color : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġend Color : ĠInt Ġ= Ġ 0 ĊĊ ĉ // ĠForward Ġdeclaration Ġof ĠSW FM orph Line Style 2 Ġproperties Ċ ĉ var Ġstart Caps Style : ĠLine Caps Style Ġ= ĠLine Caps Style . ROUND Ċ ĉ var Ġend Caps Style : ĠLine Caps Style Ġ= ĠLine Caps Style . ROUND Ċ ĉ var Ġjoint Style : ĠInt Ġ= ĠLine Joint Style . ROUND Ċ ĉ var Ġhas Fill Flag : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġno H Scale Flag : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġno V Scale Flag : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġpixel Hint ing Flag : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġno Close : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġm iter Limit Factor : ĠDouble Ġ= Ġ 3 . 0 Ċ ĉ var Ġfill Type : ĠSW FM orph Fill Style ? Ġ= Ġnull ĊĊ ĉ open Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt Ġ= Ġ 1 ) Ġ{ Ċĉ ĉ start Width Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ end Width Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ start Color Ġ= Ġdata . read RGBA () Ċĉ ĉ end Color Ġ= Ġdata . read RGBA () Ċ ĉ } ĊĊ ĉ fun Ġget M orp hed Line Style ( ratio : ĠDouble Ġ= Ġ 0 . 0 ): ĠSW F Line Style Ġ{ Ċĉ ĉ val Ġline Style Ġ= ĠSW F Line Style () Ċĉ ĉ if Ġ( has Fill Flag ) Ġ{ Ċĉĉ ĉ line Style . fill Type Ġ= Ġfill Type !!. getM orp hed Fill Style ( ratio ) Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ line Style . color Ġ= ĠColor Utils . interpolate ( start Color , Ġend Color , Ġratio ) Ċĉĉ ĉ line Style . width Ġ= Ġ( start Width Ġ+ Ġ( end Width Ġ- Ġstart Width ) Ġ* Ġratio ). toInt () Ċĉ ĉ } Ċĉ ĉ line Style . start Caps Style Ġ= Ġstart Caps Style Ċĉ ĉ line Style . end Caps Style Ġ= Ġend Caps Style Ċĉ ĉ line Style . joint Style Ġ= Ġjoint Style Ċĉ ĉ line Style . has Fill Flag Ġ= Ġhas Fill Flag Ċĉ ĉ line Style . no H Scale Flag Ġ= Ġno H Scale Flag Ċĉ ĉ line Style . no V Scale Flag Ġ= Ġno V Scale Flag Ċĉ ĉ line Style . pixel Hint ing Flag Ġ= Ġpixel Hint ing Flag Ċĉ ĉ line Style . no Close Ġ= Ġno Close Ċĉ ĉ line Style . mit er Limit Factor Ġ= Ġm iter Limit Factor Ċĉ ĉ return Ġline Style Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ return Ġ"[ SW FM orph Line Style ] ĠStart Width : Ġ$ start Width , ĠEnd Width : Ġ$ end Width , ĠStart Color : Ġ${ Color Utils . rgba ToString ( Ċĉĉ ĉ start Color Ċĉ ĉ )}, ĠEnd Color : Ġ${ Color Utils . rgba ToString ( end Color )}" Ċ ĉ } Ċ } Ċ Ċ class ĠSW FM orph Line Style 2 Ġ: ĠSW FM orph Line Style () Ġ{ Ċ ĉ override Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ start Width Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ end Width Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ start Caps Style Ġ= ĠLine Caps Style [ data . read UB ( 2 )] Ċĉ ĉ joint Style Ġ= Ġdata . read UB ( 2 ) Ċĉ ĉ has Fill Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ no H Scale Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ no V Scale Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ pixel Hint ing Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ @ Suppress (" UNUSED _ VARIABLE ") Ċĉ ĉ var Ġreserved : ĠInt Ġ= Ġdata . read UB ( 5 ) Ċĉ ĉ no Close Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ end Caps Style Ġ= ĠLine Caps Style [ data . read UB ( 2 )] Ċĉ ĉ if Ġ( joint Style Ġ== ĠLine Joint Style . MIT ER ) Ġm iter Limit Factor Ġ= Ġdata . read FIXED 8 () Ċĉ ĉ if Ġ( has Fill Flag ) Ġ{ Ċĉĉ ĉ fill Type Ġ= Ġdata . read MOR PH FILL STYLE ( level ) Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ start Color Ġ= Ġdata . read RGBA () Ċĉĉ ĉ end Color Ġ= Ġdata . read RGBA () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ var Ġstr : ĠString Ġ= Ġ"[ SW FM orph Line Style 2 ] Ġ" Ġ+ Ċĉĉĉ ĉ " Start Width : Ġ" Ġ+ Ġstart Width Ġ+ Ġ", Ġ" Ġ+ Ċĉĉĉ ĉ " End Width : Ġ" Ġ+ Ġend Width Ġ+ Ġ", Ġ" Ġ+ Ċĉĉĉ ĉ " Start Caps : Ġ" Ġ+ Ġ( start Caps Style ) Ġ+ Ġ", Ġ" Ġ+ Ċĉĉĉ ĉ " End Caps : Ġ" Ġ+ Ġ( end Caps Style ) Ġ+ Ġ", Ġ" Ġ+ Ċĉĉĉ ĉ " Joint : Ġ" Ġ+ Ġ( joint Style ) Ċĉ ĉ if Ġ( has Fill Flag ) Ġ{ Ċĉĉ ĉ str Ġ+= Ġ", ĠFill : Ġ" Ġ+ Ġfill Type . toString () Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ str Ġ+= Ġ", ĠStart Color : Ġ" Ġ+ ĠColor Utils . rgba ToString ( start Color ) Ċĉĉ ĉ str Ġ+= Ġ", ĠEnd Color : Ġ" Ġ+ ĠColor Utils . rgba ToString ( end Color ) Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } Ċ } Ċ Ċ class ĠSW FR aw Tag Ġ{ Ċ ĉ late init Ġvar Ġheader : ĠSW F Record Header Ċ ĉ late init Ġvar Ġbytes : ĠSW F Data ĊĊ ĉ fun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ val Ġpos : ĠInt Ġ= Ġdata . position Ċĉ ĉ header Ġ= Ġdata . read Tag Header () Ċĉ ĉ bytes Ġ= ĠSW F Data () Ċĉ ĉ val Ġpos Content : ĠInt Ġ= Ġdata . position Ċĉ ĉ data . position Ġ= Ġpos Ċĉ ĉ bytes . write Bytes ( data . read Bytes ( header . tag Length )) Ċĉ ĉ data . position Ġ= Ġpos Content Ċ ĉ } Ċ } Ċ Ċ class ĠSW F Record Header ( Ċ ĉ var Ġtype : ĠInt , Ċ ĉ var Ġcontent Length : ĠInt , Ċ ĉ var Ġheader Length : ĠInt Ċ ) Ġ{ Ċ ĉ val Ġtag Length : ĠInt Ġget () Ġ= Ġheader Length Ġ+ Ġcontent Length ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ċĉ ĉ "[ SW F Record Header ] Ġtype : Ġ$ type , Ġheader Length : Ġ$ header Length , Ġcontent length : Ġ$ content Length " Ċ } Ċ Ċ class ĠSW FR ect angle ( Ċ ĉ var Ġxmin : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġxmax : ĠInt Ġ= Ġ 1 1 0 0 0 , Ċ ĉ var Ġymin : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġymax : ĠInt Ġ= Ġ 8 0 0 0 Ċ ) Ġ{ Ċ ĉ protected Ġvar Ġ_ rectangle Ġ= ĠRectangle () ĊĊ ĉ fun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ data . reset Bits Pending () Ċĉ ĉ val Ġbits Ġ= Ġdata . read UB ( 5 ) Ċĉ ĉ xmin Ġ= Ġdata . read SB ( bits ) Ċĉ ĉ xmax Ġ= Ġdata . read SB ( bits ) Ċĉ ĉ ymin Ġ= Ġdata . read SB ( bits ) Ċĉ ĉ ymax Ġ= Ġdata . read SB ( bits ) Ċ ĉ } ĊĊ ĉ val Ġrect : ĠRectangle Ċĉ ĉ get () Ġ{ Ċĉĉ ĉ _ rectangle . left Ġ= ĠNumber Utils . round Pixels 2 0 ( xmin . toDouble () Ġ/ Ġ 2 0 ) Ċĉĉ ĉ _ rectangle . right Ġ= ĠNumber Utils . round Pixels 2 0 ( xmax . toDouble () Ġ/ Ġ 2 0 ) Ċĉĉ ĉ _ rectangle . top Ġ= ĠNumber Utils . round Pixels 2 0 ( ymin . toDouble () Ġ/ Ġ 2 0 ) Ċĉĉ ĉ _ rectangle . bottom Ġ= ĠNumber Utils . round Pixels 2 0 ( ymax . toDouble () Ġ/ Ġ 2 0 ) Ċĉĉ ĉ return Ġ_ rectangle Ċĉ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ" ($ xmin ,$ xmax ,$ ymin ,$ ymax )" Ċ ĉ fun ĠtoString Size (): ĠString Ġ= Ġ"(" Ġ+ Ġ(( xmax Ġ- Ġxmin ). toDouble () Ġ/ Ġ 2 0 ) Ġ+ Ġ"," Ġ+ Ġ(( ymax Ġ- Ġymin ). toDouble () Ġ/ Ġ 2 0 ) Ġ+ Ġ")" Ċ } Ċ Ċ class ĠSW F Register Param Ġ{ Ċ ĉ var Ġregister : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġname : ĠString ? Ġ= Ġnull ĊĊ ĉ fun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ register Ġ= Ġdata . read UI 8 () Ċĉ ĉ name Ġ= Ġdata . readString () Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ"$ $ register :$ name " Ċ } Ċ Ċ class ĠSW F Scene ( var Ġoffset : ĠInt , Ġvar Ġname : ĠString ) Ġ{ Ċ ĉ override Ġfun ĠtoString () Ġ= Ġ" Frame : Ġ$ offset , ĠName : Ġ$ name " Ċ } Ċ Ċ open Ġclass ĠSW F Shape ( var Ġunit Div isor : ĠDouble Ġ= Ġ 2 0 . 0 ) Ġ{ Ċ ĉ var Ġrecords Ġ= ĠArrayList < SW F Shape Record >() ĊĊ ĉ var Ġfill Styles Ġ= ĠArrayList < SW FF ill Style >() Ċ ĉ var Ġline Styles Ġ= ĠArrayList < SW F Line Style >() Ċ ĉ var Ġreference Point Ġ= ĠPoint ( 0 , Ġ 0 ) ĊĊ ĉ private Ġvar Ġfill Edge Maps Ġ= ĠArrayList < HashMap < Int , ĠArrayList < I Edge >> >() Ċ ĉ private Ġvar Ġline Edge Maps Ġ= ĠArrayList < HashMap < Int , ĠArrayList < I Edge >> >() Ċ ĉ private Ġvar Ġcurrent Fill Edge Map Ġ= Ġhash Map Of < Int , ĠArrayList < I Edge >>() Ċ ĉ private Ġvar Ġcurrent Line Edge Map Ġ= Ġhash Map Of < Int , ĠArrayList < I Edge >>() Ċ ĉ private Ġvar Ġnum Groups : ĠInt Ġ= Ġ 0 Ċ ĉ private Ġvar Ġcoord Map Ġ= Ġhash Map Of < String , ĠArrayList < I Edge >>() ĊĊ ĉ private Ġvar Ġedge Maps Created : ĠBoolean Ġ= Ġfalse ĊĊ ĉ open Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt Ġ= Ġ 1 ) Ġ{ Ċĉ ĉ data . reset Bits Pending () Ċĉ ĉ val Ġnum Fill Bits : ĠInt Ġ= Ġdata . read UB ( 4 ) Ċĉ ĉ val Ġnum Line Bits : ĠInt Ġ= Ġdata . read UB ( 4 ) Ċĉ ĉ read Shape Records ( data , Ġnum Fill Bits , Ġnum Line Bits , Ġlevel ) Ċĉ ĉ determine Reference Point () Ċ ĉ } ĊĊ ĉ protected Ġfun Ġread Shape Records ( data : ĠSW F Data , Ġ_ fill Bits : ĠInt , Ġ_ line Bits : ĠInt , Ġlevel : ĠInt Ġ= Ġ 1 ) Ġ{ Ċĉ ĉ var Ġfill Bits : ĠInt Ġ= Ġ_ fill Bits Ċĉ ĉ var Ġline Bits : ĠInt Ġ= Ġ_ line Bits Ċĉ ĉ var Ġshape Record : ĠSW F Shape Record ? Ġ= Ġnull Ċĉ ĉ while Ġ(!( shape Record Ġis ĠSW F Shape Record End )) Ġ{ Ċĉĉ ĉ // ĠThe ĠSW F 1 0 Ġspec Ġsays Ġthat Ġshape Ġrecords Ġare Ġbyte Ġaligned . Ċĉĉ ĉ // ĠIn Ġreality Ġthey Ġseem Ġnot Ġto Ġbe ? Ċĉĉ ĉ // Ġbits Pending Ġ= Ġ 0 ; Ċĉĉ ĉ val Ġedge Record Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉĉ ĉ if Ġ( edge Record ) Ġ{ Ċĉĉĉ ĉ val Ġstraight Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉĉĉ ĉ val Ġnum Bits : ĠInt Ġ= Ġdata . read UB ( 4 ) Ġ+ Ġ 2 Ċĉĉĉ ĉ if Ġ( stra ight Flag ) Ġ{ Ċĉĉĉĉ ĉ shape Record Ġ= Ġdata . read STR A IGHT ED GER EC ORD ( num Bits ) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ shape Record Ġ= Ġdata . read CUR VE DED GER EC ORD ( num Bits ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ val Ġstates : ĠInt Ġ= Ġdata . read UB ( 5 ) Ċĉĉĉ ĉ if Ġ( states Ġ== Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ shape Record Ġ= ĠSW F Shape Record End Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ val Ġstyle Change Record Ġ= Ġdata . read STYLE CHANG ER EC ORD ( states , Ġfill Bits , Ġline Bits , Ġlevel ) Ċĉĉĉĉ ĉ if Ġ( style Change Record . state New Styles ) Ġ{ Ċĉĉĉĉĉ ĉ fill Bits Ġ= Ġstyle Change Record . num Fill Bits Ċĉĉĉĉĉ ĉ line Bits Ġ= Ġstyle Change Record . num Line Bits Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ shape Record Ġ= Ġstyle Change Record Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ // println ( shape Record ) Ċĉĉ ĉ records . add ( shape Record ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġfun Ġdetermine Reference Point () Ġ{ Ċĉ ĉ val Ġstyle Change Record Ġ= Ġrecords [ 0 ] Ġas ? ĠSW F Shape Record Style Change ? Ċĉ ĉ if Ġ( style Change Record Ġ!= Ġnull Ġ&& Ġstyle Change Record . state MoveTo ) Ġ{ Ċĉĉ ĉ reference Point . x Ġ= ĠNumber Utils . round Pixels 4 0 0 ( style Change Record . move Delta X Ġ/ Ġunit Div isor ) Ċĉĉ ĉ reference Point . y Ġ= ĠNumber Utils . round Pixels 4 0 0 ( style Change Record . move Delta Y Ġ/ Ġunit Div isor ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ open Ġfun Ġexport (_ handler : ĠShape Exporter ) Ġ{ Ċĉ ĉ val Ġhandler Ġ= Ġ_ handler Ċĉ ĉ // ĠReset Ġthe Ġflag Ġso Ġthat Ġshapes Ġcan Ġbe Ġexported Ġmultiple Ġtimes Ċĉ ĉ // ĠTODO : ĠThis Ġis Ġa Ġtemporary Ġbug Ġfix . Ġedge Maps Ġshouldn 't Ġneed Ġto Ġbe Ġre created Ġfor Ġsubsequent Ġexports Ċĉ ĉ edge Maps Created Ġ= Ġfalse Ċĉ ĉ // ĠCreate Ġedge Ġmaps Ċĉ ĉ create Edge Maps () Ċĉ ĉ // ĠIf Ġno Ġhandler Ġis Ġpassed , Ġdefault Ġto ĠDefault Shape Exporter Ġ( does Ġnothing ) ĊĊĉ ĉ // ĠLet Ġthe Ġdoc Ġhandler Ġknow Ġthat Ġa Ġshape Ġexport Ġstarts Ċĉ ĉ handler . begin Shape () Ċĉ ĉ // ĠExport Ġfill s Ġand Ġst ro kes Ġfor Ġeach Ġgroup Ġseparately Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġnum Groups ) Ġ{ Ċĉĉ ĉ // ĠExport Ġfill s Ġfirst Ċĉĉ ĉ export Fill Path ( handler , Ġi ) Ċĉĉ ĉ // ĠExport Ġst ro kes Ġlast Ċĉĉ ĉ export Line Path ( handler , Ġi ) Ċĉ ĉ } Ċĉ ĉ // ĠLet Ġthe Ġdoc Ġhandler Ġknow Ġthat Ġwe 're Ġdone Ġexporting Ġa Ġshape Ċĉ ĉ handler . end Shape () Ċ ĉ } ĊĊ ĉ protected Ġfun Ġcreate Edge Maps () Ġ{ Ċĉ ĉ if Ġ(! edge Maps Created ) Ġ{ Ċĉĉ ĉ var Ġx Pos Ġ= Ġ 0 . 0 Ċĉĉ ĉ var Ġy Pos Ġ= Ġ 0 . 0 Ċĉĉ ĉ var Ġfrom : ĠI Point Ċĉĉ ĉ var Ġto : ĠI Point Ċĉĉ ĉ var Ġcontrol : ĠI Point Ċĉĉ ĉ var Ġfill Style Idx Offset Ġ= Ġ 0 Ċĉĉ ĉ var Ġline Style Idx Offset Ġ= Ġ 0 Ċĉĉ ĉ var Ġcurrent Fill Style Idx 0 Ġ= Ġ 0 Ċĉĉ ĉ var Ġcurrent Fill Style Idx 1 Ġ= Ġ 0 Ċĉĉ ĉ var Ġcurrent Line Style Idx Ġ= Ġ 0 Ċĉĉ ĉ var Ġsub Path : ĠArrayList < I Edge > Ġ= ĠArrayList < I Edge >() Ċĉĉ ĉ num Groups Ġ= Ġ 0 Ċĉĉ ĉ fill Edge Maps Ġ= Ġarray ListOf < HashMap < Int , ĠArrayList < I Edge >> >() Ċĉĉ ĉ line Edge Maps Ġ= Ġarray ListOf < HashMap < Int , ĠArrayList < I Edge >> >() Ċĉĉ ĉ current Fill Edge Map Ġ= ĠHashMap < Int , ĠArrayList < I Edge >>() Ċĉĉ ĉ current Line Edge Map Ġ= ĠHashMap < Int , ĠArrayList < I Edge >>() Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġrecords . size ) Ġ{ Ċĉĉĉ ĉ val Ġshape Record : ĠSW F Shape Record Ġ= Ġrecords [ i ] Ċĉĉĉ ĉ when Ġ( shape Record . type ) Ġ{ Ċĉĉĉĉ ĉ SW F Shape Record . TYPE _ STYLE CHANGE Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ val Ġstyle Change Record : ĠSW F Shape Record Style Change Ġ= Ġshape Record Ġas ĠSW F Shape Record Style Change Ċĉĉĉĉĉ ĉ if Ġ( style Change Record . state Line Style Ġ|| Ġstyle Change Record . state Fill Style 0 Ġ|| Ġstyle Change Record . state Fill Style 1 ) Ġ{ Ċĉĉĉĉĉĉ ĉ process Sub Path ( sub Path , Ġcurrent Line Style Idx , Ġcurrent Fill Style Idx 0 , Ġcurrent Fill Style Idx 1 ) Ċĉĉĉĉĉĉ ĉ sub Path Ġ= ĠArrayList < I Edge >() Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ if Ġ( style Change Record . state New Styles ) Ġ{ Ċĉĉĉĉĉĉ ĉ fillStyle Idx Offset Ġ= Ġfill Styles . size Ċĉĉĉĉĉĉ ĉ line Style Idx Offset Ġ= Ġline Styles . size Ċĉĉĉĉĉĉ ĉ fill Styles . addAll ( style Change Record . fill Styles ) Ċĉĉĉĉĉĉ ĉ line Styles . addAll ( style Change Record . line Styles ) Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ // ĠCheck Ġif Ġall Ġstyles Ġare Ġreset Ġto Ġ 0 . Ċĉĉĉĉĉ ĉ // ĠThis Ġ( prob ably ) Ġmeans Ġthat Ġa Ġgroup Ġstarts Ġwith Ġthe Ġnext Ġrecord Ċĉĉĉĉĉ ĉ if Ġ( style Change Record . state Line Style Ġ&& Ġstyle Change Record . line Style Ġ== Ġ 0 Ġ&& Ċĉĉĉĉĉĉ ĉ style Change Record . state Fill Style 0 Ġ&& Ġstyle Change Record . fillStyle 0 Ġ== Ġ 0 Ġ&& Ċĉĉĉĉĉĉ ĉ style Change Record . state Fill Style 1 Ġ&& Ġstyle Change Record . fillStyle 1 Ġ== Ġ 0 Ċĉĉĉĉĉ ĉ ) Ġ{ Ċĉĉĉĉĉĉ ĉ clean Edge Map ( current Fill Edge Map ) Ċĉĉĉĉĉĉ ĉ clean Edge Map ( current Line Edge Map ) Ċĉĉĉĉĉĉ ĉ fill Edge Maps . add ( current Fill Edge Map ) Ċĉĉĉĉĉĉ ĉ line Edge Maps . add ( current Line Edge Map ) Ċĉĉĉĉĉĉ ĉ current Fill Edge Map Ġ= Ġhash Map Of () Ċĉĉĉĉĉĉ ĉ current Line Edge Map Ġ= Ġhash Map Of () Ċĉĉĉĉĉĉ ĉ current Line Style Idx Ġ= Ġ 0 Ċĉĉĉĉĉĉ ĉ current Fill Style Idx 0 Ġ= Ġ 0 Ċĉĉĉĉĉĉ ĉ current Fill Style Idx 1 Ġ= Ġ 0 Ċĉĉĉĉĉĉ ĉ num Groups ++ Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ if Ġ( style Change Record . state Line Style ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ current Line Style Idx Ġ= Ġstyle Change Record . line Style Ċĉĉĉĉĉĉĉ ĉ if Ġ( current Line Style Idx Ġ> Ġ 0 ) Ġcurrent Line Style Idx Ġ+= Ġline Style Idx Offset Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ if Ġ( style Change Record . state Fill Style 0 ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ current Fill Style Idx 0 Ġ= Ġstyle Change Record . fillStyle 0 Ċĉĉĉĉĉĉĉ ĉ if Ġ( current Fill Style Idx 0 Ġ> Ġ 0 ) Ġcurrent Fill Style Idx 0 Ġ+= Ġfill Style Idx Offset Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ if Ġ( style Change Record . state Fill Style 1 ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ current Fill Style Idx 1 Ġ= Ġstyle Change Record . fillStyle 1 Ċĉĉĉĉĉĉĉ ĉ if Ġ( current Fill Style Idx 1 Ġ> Ġ 0 ) Ġcurrent Fill Style Idx 1 Ġ+= Ġfill Style Idx Offset Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ if Ġ( style Change Record . state MoveTo ) Ġ{ Ċĉĉĉĉĉĉ ĉ x Pos Ġ= Ġstyle Change Record . move Delta X Ġ/ Ġunit Div isor Ċĉĉĉĉĉĉ ĉ y Pos Ġ= Ġstyle Change Record . move Delta Y Ġ/ Ġunit Div isor Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ SW F Shape Record . TYPE _ STR A IGHT EDGE Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ val Ġstraight Edge Record : ĠSW F Shape Record Str aight Edge Ġ= Ġshape Record Ġas ĠSW F Shape Record Str aight Edge Ċĉĉĉĉĉ ĉ from Ġ= ĠI Point ( Number Utils . round Pixels 4 0 0 ( x Pos ), ĠNumber Utils . round Pixels 4 0 0 ( y Pos )) Ċĉĉĉĉĉ ĉ if Ġ( stra ight Edge Record . general Line Flag ) Ġ{ Ċĉĉĉĉĉĉ ĉ x Pos Ġ+= Ġstraight Edge Record . delta X Ġ/ Ġunit Div isor Ċĉĉĉĉĉĉ ĉ y Pos Ġ+= Ġstraight Edge Record . delta Y Ġ/ Ġunit Div isor Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ if Ġ( stra ight Edge Record . vert Line Flag ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ y Pos Ġ+= Ġstraight Edge Record . delta Y Ġ/ Ġunit Div isor Ċĉĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉĉ ĉ x Pos Ġ+= Ġstraight Edge Record . delta X Ġ/ Ġunit Div isor Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ to Ġ= ĠI Point ( Number Utils . round Pixels 4 0 0 ( x Pos ), ĠNumber Utils . round Pixels 4 0 0 ( y Pos )) Ċĉĉĉĉĉ ĉ sub Path . add ( Str aight Edge ( from , Ġto , Ġcurrent Line Style Idx , Ġcurrent Fill Style Idx 1 )) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ SW F Shape Record . TYPE _ CUR VE DED GE Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ val Ġcur ved Edge Record : ĠSW F Shape Record Cur ved Edge Ġ= Ġshape Record Ġas ĠSW F Shape Record Cur ved Edge Ċĉĉĉĉĉ ĉ from Ġ= ĠI Point ( Number Utils . round Pixels 4 0 0 ( x Pos ), ĠNumber Utils . round Pixels 4 0 0 ( y Pos )) Ċĉĉĉĉĉ ĉ val Ġx Pos Control : ĠDouble Ġ= Ġx Pos Ġ+ Ġcur ved Edge Record . control Delta X Ġ/ Ġunit Div isor Ċĉĉĉĉĉ ĉ val Ġy Pos Control : ĠDouble Ġ= Ġy Pos Ġ+ Ġcur ved Edge Record . control Delta Y Ġ/ Ġunit Div isor Ċĉĉĉĉĉ ĉ x Pos Ġ= Ġx Pos Control Ġ+ Ġcur ved Edge Record . anchor Delta X Ġ/ Ġunit Div isor Ċĉĉĉĉĉ ĉ y Pos Ġ= Ġy Pos Control Ġ+ Ġcur ved Edge Record . anchor Delta Y Ġ/ Ġunit Div isor Ċĉĉĉĉĉ ĉ control Ġ= ĠI Point ( x Pos Control , Ġy Pos Control ) Ċĉĉĉĉĉ ĉ to Ġ= ĠI Point ( Number Utils . round Pixels 4 0 0 ( x Pos ), ĠNumber Utils . round Pixels 4 0 0 ( y Pos )) Ċĉĉĉĉĉ ĉ sub Path . add ( Cur ved Edge ( from , Ġcontrol , Ġto , Ġcurrent Line Style Idx , Ġcurrent Fill Style Idx 1 )) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ SW F Shape Record . TYPE _ END Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ // ĠWe 're Ġdone . ĠProcess Ġthe Ġlast Ġsub path , Ġif Ġany Ċĉĉĉĉĉ ĉ process Sub Path ( sub Path , Ġcurrent Line Style Idx , Ġcurrent Fill Style Idx 0 , Ġcurrent Fill Style Idx 1 ) Ċĉĉĉĉĉ ĉ clean Edge Map ( current Fill Edge Map ) Ċĉĉĉĉĉ ĉ clean Edge Map ( current Line Edge Map ) Ċĉĉĉĉĉ ĉ fill Edge Maps . add ( current Fill Edge Map ) Ċĉĉĉĉĉ ĉ line Edge Maps . add ( current Line Edge Map ) Ċĉĉĉĉĉ ĉ num Groups ++ Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ edge Maps Created Ġ= Ġtrue Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġfun Ġprocess Sub Path ( Ċĉ ĉ sub Path : ĠArrayList < I Edge >, Ċĉ ĉ line Style Idx : ĠInt , Ċĉ ĉ fillStyle Idx 0 : ĠInt , Ċĉ ĉ fillStyle Idx 1 : ĠInt Ċ ĉ ) Ġ{ Ċĉ ĉ if Ġ( fillStyle Idx 0 Ġ!= Ġ 0 ) Ġ{ Ċĉĉ ĉ var Ġpath Ġ= Ġcurrent Fill Edge Map [ fillStyle Idx 0 ] Ċĉĉ ĉ if Ġ( path Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ path Ġ= ĠArrayList < I Edge >() Ċĉĉĉ ĉ current Fill Edge Map [ fillStyle Idx 0 ] Ġ= Ġpath Ċĉĉ ĉ } Ċĉĉ ĉ for Ġ(_ j Ġin Ġ 0 Ġuntil Ġsub Path . size ) Ġ{ Ċĉĉĉ ĉ val Ġj Ġ= Ġsub Path . size Ġ- Ġ 1 Ġ- Ġ_ j Ċĉĉĉ ĉ path . add ( sub Path [ j ]. reverse With New Fill Style ( fillStyle Idx 0 )) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ if Ġ( fillStyle Idx 1 Ġ!= Ġ 0 ) Ġ{ Ċĉĉ ĉ var Ġpath Ġ= Ġcurrent Fill Edge Map [ fillStyle Idx 1 ] Ċĉĉ ĉ if Ġ( path Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ path Ġ= ĠArrayList < I Edge >() Ċĉĉĉ ĉ current Fill Edge Map [ fillStyle Idx 1 ] Ġ= Ġpath Ċĉĉ ĉ } Ċĉĉ ĉ path . addAll ( sub Path ) Ċĉ ĉ } Ċĉ ĉ if Ġ( line Style Idx Ġ!= Ġ 0 ) Ġ{ Ċĉĉ ĉ var Ġpath Ġ= Ġcurrent Line Edge Map [ line Style Idx ] Ċĉĉ ĉ if Ġ( path Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ path Ġ= ĠArrayList < I Edge >() Ċĉĉĉ ĉ current Line Edge Map [ line Style Idx ] Ġ= Ġpath Ċĉĉ ĉ } Ċĉĉ ĉ path . addAll ( sub Path ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġfun Ġexport Fill Path ( handler : ĠShape Exporter , Ġgroup Index : ĠInt ) Ġ{ Ċĉ ĉ val Ġpath : ĠArrayList < I Edge > Ġ= Ġcreate Path From Edge Map ( fill Edge Maps [ group Index ]) Ċĉ ĉ var Ġpos Ġ= ĠI Point ( Int . MAX _ VALUE , ĠInt . MAX _ VALUE ) Ċĉ ĉ var Ġfill Style Idx : ĠInt Ġ= ĠInt . MAX _ VALUE Ċĉ ĉ if Ġ( path . size Ġ> Ġ 0 ) Ġ{ Ċĉĉ ĉ handler . begin Fill s () Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġpath . size ) Ġ{ Ċĉĉĉ ĉ val Ġe Ġ= Ġpath [ i ] Ċĉĉĉ ĉ if Ġ( fillStyle Idx Ġ!= Ġe . fillStyle Idx ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( fillStyle Idx Ġ!= ĠInt . MAX _ VALUE ) Ġhandler . end Fill () Ċĉĉĉĉ ĉ fillStyle Idx Ġ= Ġe . fillStyle Idx Ċĉĉĉĉ ĉ pos Ġ= ĠI Point ( Int . MAX _ VALUE , ĠInt . MAX _ VALUE ) Ċĉĉĉĉ ĉ try Ġ{ Ċĉĉĉĉĉ ĉ var Ġmatrix : ĠMatrix Ċĉĉĉĉĉ ĉ val Ġfill Style : ĠSW FF ill Style Ġ= Ġfill Styles [ fillStyle Idx Ġ- Ġ 1 ] Ċĉĉĉĉĉ ĉ when Ġ( fillStyle . type ) Ġ{ Ċĉĉĉĉĉĉĉ 0 x 0 0 Ġ-> Ġ{ Ċĉĉĉĉĉĉĉ ĉ // ĠSolid Ġfill Ċĉĉĉĉĉĉĉ ĉ handler . begin Fill ( Color Utils . rgb ( fillStyle . rgb ), ĠColor Utils . alpha ( fillStyle . rgb )) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ 0 x 1 0 , Ċĉĉĉĉĉĉĉ 0 x 1 2 , Ċĉĉĉĉĉĉĉ 0 x 1 3 Ġ-> Ġ{ Ċĉĉĉĉĉĉĉ ĉ // ĠGradient Ġfill Ċĉĉĉĉĉĉĉ ĉ val Ġcolors Ġ= Ġarray ListOf < Int >() Ċĉĉĉĉĉĉĉ ĉ val Ġal ph as Ġ= Ġarray ListOf < Double >() Ċĉĉĉĉĉĉĉ ĉ val Ġrat ios Ġ= Ġarray ListOf < Int >() Ċĉĉĉĉĉĉĉ ĉ matrix Ġ= Ġfill Style . gradient Matrix !!. matrix . clone () Ċĉĉĉĉĉĉĉ ĉ for Ġ( g ri Ġin Ġ 0 Ġuntil Ġfill Style . gradient !!. records . size ) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ val Ġgradient Record Ġ= Ġfill Style . gradient !!. records [ g ri ] Ċĉĉĉĉĉĉĉĉ ĉ colors . add ( Color Utils . rgb ( gradient Record . color )) Ċĉĉĉĉĉĉĉĉ ĉ alph as . add ( Color Utils . alpha ( gradient Record . color )) Ċĉĉĉĉĉĉĉĉ ĉ rat ios . add ( gradient Record . ratio ) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ handler . begin Gradient Fill ( Ċĉĉĉĉĉĉĉĉ ĉ if Ġ( fillStyle . type Ġ== Ġ 0 x 1 0 ) ĠGradient Type . LINEAR Ġelse ĠGradient Type . RAD IAL , Ċĉĉĉĉĉĉĉĉ ĉ colors , Ġal ph as , Ġrat ios , Ġmatrix , Ċĉĉĉĉĉĉĉĉ ĉ fillStyle . gradient !!. spread Mode , Ċĉĉĉĉĉĉĉĉ ĉ fillStyle . gradient !!. interpolation Mode , Ċĉĉĉĉĉĉĉĉ ĉ fillStyle . gradient !!. focal Point Ċĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ 0 x 4 0 , Ċĉĉĉĉĉĉĉ 0 x 4 1 , Ċĉĉĉĉĉĉĉ 0 x 4 2 , Ċĉĉĉĉĉĉĉ 0 x 4 3 Ġ-> Ġ{ Ċĉĉĉĉĉĉĉ ĉ // ĠBitmap Ġfill Ċĉĉĉĉĉĉĉ ĉ val Ġm Ġ= Ġfill Style . bitmap Matrix !! Ċĉĉĉĉĉĉĉ ĉ matrix Ġ= ĠMatrix () Ċĉĉĉĉĉĉĉ ĉ matrix . create Box ( Ċĉĉĉĉĉĉĉĉ ĉ m . x scale Ġ/ Ġ 2 0 , Ċĉĉĉĉĉĉĉĉ ĉ m . y scale Ġ/ Ġ 2 0 , Ċĉĉĉĉĉĉĉĉ ĉ m . rotation , Ċĉĉĉĉĉĉĉĉ ĉ m . translate X Ġ/ Ġ 2 0 . 0 , Ċĉĉĉĉĉĉĉĉ ĉ m . translate Y Ġ/ Ġ 2 0 . 0 Ċĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉĉ ĉ handler . begin Bitmap Fill ( Ċĉĉĉĉĉĉĉĉ ĉ fillStyle . bitmap Id , Ċĉĉĉĉĉĉĉĉ ĉ matrix , Ċĉĉĉĉĉĉĉĉ ĉ ( fillStyle . type Ġ== Ġ 0 x 4 0 Ġ|| Ġfill Style . type Ġ== Ġ 0 x 4 2 ), Ċĉĉĉĉĉĉĉĉ ĉ ( fillStyle . type Ġ== Ġ 0 x 4 0 Ġ|| Ġfill Style . type Ġ== Ġ 0 x 4 1 ) Ċĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ġcatch Ġ( e : ĠError ) Ġ{ Ċĉĉĉĉĉ ĉ // ĠFont Ġshapes Ġdefine Ġno Ġfill styles Ġper Ġse , Ġbut Ġdo Ġreference Ġfill style Ġindex Ġ 1 , Ċĉĉĉĉĉ ĉ // Ġwhich Ġrepresents Ġthe Ġfont Ġcolor . ĠWe Ġjust Ġreport Ġsolid Ġblack Ġin Ġthis Ġcase . Ċĉĉĉĉĉ ĉ handler . begin Fill ( 0 ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( pos Ġ!= Ġe . from ) Ġhandler . moveTo ( e . from . x , Ġe . from . y ) Ċĉĉĉ ĉ if Ġ( e Ġis ĠCur ved Edge ) Ġ{ Ċĉĉĉĉ ĉ val Ġc Ġ= Ġe Ċĉĉĉĉ ĉ handler . curve To ( c . control . x , Ġc . control . y , Ġc . to . x , Ġc . to . y ) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ handler . lineTo ( e . to . x , Ġe . to . y ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ pos Ġ= Ġe . to Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( fillStyle Idx Ġ!= ĠInt . MAX _ VALUE ) Ġ{ Ċĉĉĉ ĉ handler . end Fill () Ċĉĉ ĉ } Ċĉĉ ĉ handler . end Fill s () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġfun Ġexport Line Path ( handler : ĠShape Exporter , Ġgroup Index : ĠInt ) Ġ{ Ċĉ ĉ val Ġpath Ġ= Ġcreate Path From Edge Map ( line Edge Maps [ group Index ]) Ċĉ ĉ var Ġpos Ġ= ĠI Point ( Int . MAX _ VALUE , ĠInt . MAX _ VALUE ) Ċĉ ĉ var Ġline Style Idx Ġ= ĠInt . MAX _ VALUE Ċĉ ĉ if Ġ( path . size Ġ> Ġ 0 ) Ġ{ Ċĉĉ ĉ handler . begin Lines () Ċĉĉ ĉ var Ġbase Point : ĠI Point ? Ġ= Ġnull Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġpath . size ) Ġ{ Ċĉĉĉ ĉ val Ġe : ĠI Edge Ġ= Ġpath [ i ] Ċĉĉĉ ĉ if Ġ( line Style Idx Ġ!= Ġe . line Style Idx ) Ġ{ Ċĉĉĉĉ ĉ line Style Idx Ġ= Ġe . line Style Idx Ċĉĉĉĉ ĉ pos Ġ= ĠI Point ( Int . MAX _ VALUE , ĠInt . MAX _ VALUE ) Ċĉĉĉĉ ĉ val Ġline Style Ġ= Ġtry Ġ{ Ċĉĉĉĉĉ ĉ line Styles [ line Style Idx Ġ- Ġ 1 ] Ċĉĉĉĉ ĉ } Ġcatch Ġ( e : ĠError ) Ġ{ Ċĉĉĉĉĉ ĉ null Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ if Ġ( line Style Ġ!= Ġnull ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġscale Mode Ġ= Ġwhen Ġ{ Ċĉĉĉĉĉĉ ĉ ( line Style . no H Scale Flag Ġ&& Ġline Style . no V Scale Flag ) Ġ-> ĠLine Scale Mode . NONE Ċĉĉĉĉĉĉ ĉ line Style . no H Scale Flag Ġ-> ĠLine Scale Mode . HORIZONTAL Ċĉĉĉĉĉĉ ĉ line Style . no V Scale Flag Ġ-> ĠLine Scale Mode . VERTICAL Ċĉĉĉĉĉĉ ĉ else Ġ-> ĠLine Scale Mode . NORMAL Ċĉĉĉĉĉ ĉ } ĊĊĉĉĉĉĉ ĉ handler . line Style ( Ċĉĉĉĉĉĉ ĉ line Style . width . toDouble () Ġ/ Ġ 2 0 , Ċĉĉĉĉĉĉ ĉ Color Utils . rgb ( line Style . color ), Ċĉĉĉĉĉĉ ĉ Color Utils . alpha ( line Style . color ), Ċĉĉĉĉĉĉ ĉ line Style . pixel Hint ing Flag , Ċĉĉĉĉĉĉ ĉ scale Mode , Ċĉĉĉĉĉĉ ĉ ( line Style . start Caps Style ), Ċĉĉĉĉĉĉ ĉ ( line Style . end Caps Style ), Ċĉĉĉĉĉĉ ĉ Line Joint Style . toString ( line Style . joint Style ), Ċĉĉĉĉĉĉ ĉ line Style . mit er Limit Factor Ċĉĉĉĉĉ ĉ ) ĊĊĉĉĉĉĉ ĉ if Ġ( line Style . has Fill Flag ) Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġfill Style : ĠSW FF ill Style Ġ= Ġline Style . fill Type !! Ċĉĉĉĉĉĉ ĉ when Ġ( fillStyle . type ) Ġ{ Ċĉĉĉĉĉĉĉĉ 0 x 1 0 , Ġ 0 x 1 2 , Ġ 0 x 1 3 Ġ-> Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ // ĠGradient Ġfill Ċĉĉĉĉĉĉĉĉ ĉ val Ġcolors Ġ= Ġarray ListOf < Int >() Ċĉĉĉĉĉĉĉĉ ĉ val Ġal ph as Ġ= Ġarray ListOf < Double >() Ċĉĉĉĉĉĉĉĉ ĉ val Ġrat ios Ġ= Ġarray ListOf < Int >() Ċĉĉĉĉĉĉĉĉ ĉ var Ġgradient Record : ĠSW F Gradient Record Ċĉĉĉĉĉĉĉĉ ĉ val Ġmatrix Ġ= Ġfill Style . gradient Matrix !!. matrix . clone () Ċĉĉĉĉĉĉĉĉ ĉ for Ġ( g ri Ġin Ġ 0 Ġuntil Ġfill Style . gradient !!. records . size ) Ġ{ Ċĉĉĉĉĉĉĉĉĉ ĉ gradient Record Ġ= Ġfill Style . gradient !!. records [ g ri ] Ċĉĉĉĉĉĉĉĉĉ ĉ colors . add ( Color Utils . rgb ( gradient Record . color )) Ċĉĉĉĉĉĉĉĉĉ ĉ alph as . add ( Color Utils . alpha ( gradient Record . color )) Ċĉĉĉĉĉĉĉĉĉ ĉ rat ios . add ( gradient Record . ratio ) Ċĉĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉĉ ĉ handler . line Gradient Style ( Ċĉĉĉĉĉĉĉĉĉ ĉ if Ġ( fillStyle . type Ġ== Ġ 0 x 1 0 ) ĠGradient Type . LINEAR Ġelse ĠGradient Type . RAD IAL , Ċĉĉĉĉĉĉĉĉĉ ĉ colors , Ġal ph as , Ġrat ios , Ġmatrix , Ċĉĉĉĉĉĉĉĉĉ ĉ fillStyle . gradient !!. spread Mode , Ċĉĉĉĉĉĉĉĉĉ ĉ fillStyle . gradient !!. interpolation Mode , Ċĉĉĉĉĉĉĉĉĉ ĉ fillStyle . gradient !!. focal Point Ċĉĉĉĉĉĉĉĉ ĉ ) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉ ĉ // ĠWe Ġshould Ġnever Ġget Ġhere Ċĉĉĉĉĉ ĉ handler . line Style ( 0 . 0 ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( e . from Ġ!= Ġpos ) Ġ{ Ċĉĉĉĉ ĉ base Point Ġ= Ġe . from Ċĉĉĉĉ ĉ handler . moveTo ( e . from . x , Ġe . from . y ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( e Ġis ĠCur ved Edge ) Ġ{ Ċĉĉĉĉ ĉ handler . curve To ( e . control . x , Ġe . control . y , Ġe . to . x , Ġe . to . y ) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ handler . lineTo ( e . to . x , Ġe . to . y ) Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ if Ġ( e . to Ġ== Ġbase Point ) Ġ{ Ċĉĉĉĉ ĉ handler . close Path () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ pos Ġ= Ġe . to Ċĉĉ ĉ } Ċĉĉ ĉ handler . end Lines () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġfun Ġcreate Path From Edge Map ( edge Map : ĠHashMap < Int , ĠArrayList < I Edge >> ): ĠArrayList < I Edge > Ġ{ Ċĉ ĉ val Ġnew Path : ĠArrayList < I Edge > Ġ= ĠArrayList < I Edge >() Ċĉ ĉ val Ġstyle Idx Array Ġ= Ġarray ListOf < Int >() Ċĉ ĉ for Ġ( style Idx Ġin Ġedge Map . keys ) Ġ{ Ċĉĉ ĉ style Idx Array . add ( style Idx ) Ċĉ ĉ } Ċĉ ĉ style Idx Array . sort () Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġstyle Idx Array . size ) Ġ{ Ċĉĉ ĉ new Path . addAll ( edge Map [ style Idx Array [ i ]] !! ) Ċĉ ĉ } Ċĉ ĉ return Ġnew Path Ċ ĉ } ĊĊ ĉ protected Ġfun Ġclean Edge Map ( edge Map : ĠHashMap < Int , ĠArrayList < I Edge >>) Ġ{ Ċĉ ĉ for Ġ( style Idx Ġin Ġedge Map . keys ) Ġ{ Ċĉĉ ĉ val Ġsub Path Ġ= Ġedge Map [ style Idx ] Ċĉĉ ĉ if Ġ( sub Path Ġ!= Ġnull Ġ&& Ġsub Path . size Ġ> Ġ 0 ) Ġ{ Ċĉĉĉ ĉ var Ġprev Edge : ĠI Edge ? Ġ= Ġnull Ċĉĉĉ ĉ val Ġtmp Path Ġ= ĠArrayList < I Edge >() Ċĉĉĉ ĉ create Coord Map ( sub Path ) Ċĉĉĉ ĉ while Ġ( sub Path . size Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ var Ġidx Ġ= Ġ 0 Ċĉĉĉĉ ĉ while Ġ( idx Ġ< Ġsub Path . size ) Ġ{ Ċĉĉĉĉĉ ĉ if Ġ( prev Edge Ġ== Ġnull Ġ|| Ġprev Edge . to Ġ== Ġsub Path [ idx ]. from ) Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġedge Ġ= Ġsub Path . remove At ( idx ) Ċĉĉĉĉĉĉ ĉ tmp Path . add ( edge ) Ċĉĉĉĉĉĉ ĉ remove Edge From Coord Map ( edge ) Ċĉĉĉĉĉĉ ĉ prev Edge Ġ= Ġedge Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġedge Ġ= Ġfind Next Edge In Coord Map ( prev Edge ) Ċĉĉĉĉĉĉ ĉ if Ġ( edge Ġ!= Ġnull ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ idx Ġ= Ġsub Path . indexOf ( edge ) Ċĉĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉĉ ĉ idx Ġ= Ġ 0 Ċĉĉĉĉĉĉĉ ĉ prev Edge Ġ= Ġnull Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ edge Map [ style Idx ] Ġ= Ġtmp Path Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġfun Ġcreate Coord Map ( path : ĠArrayList < I Edge >) Ġ{ Ċĉ ĉ coord Map Ġ= Ġhash Map Of () Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġpath . size ) Ġ{ Ċĉĉ ĉ val Ġfrom : ĠI Point Ġ= Ġpath [ i ]. from Ċĉĉ ĉ val Ġkey Ġ= Ġ"${ from . x }_${ from . y }" Ċĉĉ ĉ val Ġcoord Map Array Ġ= Ġcoord Map [ key ] Ċĉĉ ĉ if Ġ( coord Map Array Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ coord Map [ key ] Ġ= Ġarray ListOf ( path [ i ]) Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ coord Map Array . add ( path [ i ]) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġfun Ġremove Edge From Coord Map ( edge : ĠI Edge ) Ġ{ Ċĉ ĉ val Ġkey : ĠString Ġ= Ġ"" Ġ+ Ġedge . from . x Ġ+ Ġ"_" Ġ+ Ġedge . from . y Ċĉ ĉ val Ġcoord Map Array Ġ= Ġcoord Map [ key ] Ċĉ ĉ if Ġ( coord Map Array Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ if Ġ( coord Map Array . size Ġ== Ġ 1 ) Ġ{ Ċĉĉĉ ĉ coord Map . remove ( key ) Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ val Ġi Ġ= Ġcoord Map Array . indexOf ( edge ) Ċĉĉĉ ĉ if Ġ( i Ġ> Ġ- 1 ) Ġcoord Map Array . remove At ( i ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġfun Ġfind Next Edge In Coord Map ( edge : ĠI Edge ): ĠI Edge ? Ġ{ Ċĉ ĉ val Ġcoord Map Array Ġ= Ġcoord Map [" ${ edge . to . x }_${ edge . to . y } "] Ċĉ ĉ return Ġif Ġ( coord Map Array Ġ!= Ġnull Ġ&& Ġcoord Map Array . isNotEmpty ()) Ġcoord Map Array [ 0 ] Ġelse Ġnull Ċ ĉ } ĊĊ ĉ open Ġfun ĠtoString ( indent : ĠInt Ġ= Ġ 0 ): ĠString Ġ{ Ċĉ ĉ var Ġstr : ĠString Ġ= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent ) Ġ+ Ġ" Shape Records :" Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġrecords . size ) Ġ{ Ċĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ"[" Ġ+ Ġi Ġ+ Ġ"] Ġ" Ġ+ Ġrecords [ i ]. toString () Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } Ċ } Ċ Ċ open Ġclass ĠSW F Shape Record Ġ{ Ċ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ const Ġval ĠTYPE _ UNKNOWN Ġ= Ġ 0 Ċĉ ĉ const Ġval ĠTYPE _ END Ġ= Ġ 1 Ċĉ ĉ const Ġval ĠTYPE _ STYLE CHANGE Ġ= Ġ 2 Ċĉ ĉ const Ġval ĠTYPE _ STR A IGHT EDGE Ġ= Ġ 3 Ċĉ ĉ const Ġval ĠTYPE _ CUR VE DED GE Ġ= Ġ 4 Ċ ĉ } ĊĊ ĉ open Ġval Ġtype Ġ= ĠSW F Shape Record . TYPE _ UNKNOWN Ċ ĉ @ Suppress (" unused ") Ċ ĉ val Ġis Edge Record : ĠBoolean Ċĉ ĉ get () Ġ= Ġ( type Ġ== ĠSW F Shape Record . TYPE _ STR A IGHT EDGE Ġ|| Ġtype Ġ== ĠSW F Shape Record . TYPE _ CUR VE DED GE ) ĊĊ ĉ open Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt Ġ= Ġ 1 ): ĠUnit Ġ= ĠUnit Ċ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ"[ SW F Shape Record ]" ĊĊ ĉ open Ġfun Ġclone (): ĠSW F Shape Record Ġ= ĠSW F Shape Record () Ċ } Ċ Ċ data Ġclass ĠSW F Shape Record Cur ved Edge ( Ċ ĉ var Ġnum Bits : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġcontrol Delta X : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġcontrol Delta Y : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġanchor Delta X : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġanchor Delta Y : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠSW F Shape Record () Ġ{ Ċ ĉ override Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ control Delta X Ġ= Ġdata . read SB ( num Bits ) Ċĉ ĉ control Delta Y Ġ= Ġdata . read SB ( num Bits ) Ċĉ ĉ anchor Delta X Ġ= Ġdata . read SB ( num Bits ) Ċĉ ĉ anchor Delta Y Ġ= Ġdata . read SB ( num Bits ) Ċ ĉ } ĊĊ ĉ override Ġval Ġtype Ġ= ĠSW F Shape Record . TYPE _ CUR VE DED GE Ċ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ċĉ ĉ "[ SW F Shape Record Cur ved Edge ] ĠControl Delta : Ġ$ control Delta X ,$ control Delta Y , ĠAnchor Delta : Ġ$ anchor Delta X ,$ anchor Delta Y " ĊĊ ĉ override Ġfun Ġclone (): ĠSW F Shape Record Ġ= Ġthis . copy () Ċ Ċ } Ċ Ċ object ĠSW F Shape Record End Ġ: ĠSW F Shape Record () Ġ{ Ċ ĉ override Ġval Ġtype Ġ= ĠSW F Shape Record . TYPE _ END Ċ ĉ override Ġfun ĠtoString () Ġ= Ġ"[ SW F Shape Record End ]" ĊĊ ĉ override Ġfun Ġclone (): ĠSW F Shape Record Ġ= Ġthis Ċ } Ċ Ċ data Ġclass ĠSW F Shape Record Str aight Edge ( Ċ ĉ var Ġnum Bits : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġgeneral Line Flag : ĠBoolean Ġ= Ġfalse , Ċ ĉ var Ġvert Line Flag : ĠBoolean Ġ= Ġfalse , Ċ ĉ var Ġdelta Y : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġdelta X : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠSW F Shape Record () Ġ{ ĊĊ ĉ override Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ general Line Flag Ġ= Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ċĉ ĉ vert Line Flag Ġ= Ġif Ġ(! general Line Flag ) Ġ( data . read UB ( 1 ) Ġ== Ġ 1 ) Ġelse Ġfalse Ċĉ ĉ delta X Ġ= Ġif Ġ( general Line Flag Ġ|| Ġ! vert Line Flag ) Ġdata . read SB ( num Bits ) Ġelse Ġ 0 Ċĉ ĉ delta Y Ġ= Ġif Ġ( general Line Flag Ġ|| Ġvert Line Flag ) Ġdata . read SB ( num Bits ) Ġelse Ġ 0 Ċ ĉ } ĊĊ ĉ override Ġval Ġtype Ġ= ĠSW F Shape Record . TYPE _ STR A IGHT EDGE ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ var Ġstr Ġ= Ġ"[ SW F Shape Record Str aight Edge ] Ġ" Ċĉ ĉ str Ġ+= Ġwhen Ġ{ Ċĉĉ ĉ general Line Flag Ġ-> Ġ" General : Ġ$ delta X ,$ delta Y " Ċĉĉ ĉ vert Line Flag Ġ-> Ġ" Vertical : Ġ$ delta Y " Ċĉĉ ĉ else Ġ-> Ġ" Horizontal : Ġ$ delta X " Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } ĊĊ ĉ override Ġfun Ġclone (): ĠSW F Shape Record Ġ= Ġthis . copy () Ċ } Ċ Ċ data Ġclass ĠSW F Shape Record Style Change ( Ċ ĉ val Ġstates : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġnum Fill Bits : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġnum Line Bits : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġmove Delta X : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġmove Delta Y : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġfill Style 0 : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġfill Style 1 : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġline Style : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġfill Styles : ĠArrayList < SW FF ill Style > Ġ= ĠArrayList < SW FF ill Style >(), Ċ ĉ var Ġline Styles : ĠArrayList < SW F Line Style > Ġ= ĠArrayList < SW F Line Style >() Ċ ) Ġ: ĠSW F Shape Record () Ġ{ Ċ ĉ val Ġstate New Styles : ĠBoolean Ġget () Ġ= Ġ(( states Ġand Ġ 0 x 1 0 ) Ġ!= Ġ 0 ) Ċ ĉ val Ġstate Line Style : ĠBoolean Ġget () Ġ= Ġ(( states Ġand Ġ 0 x 0 8 ) Ġ!= Ġ 0 ) Ċ ĉ val Ġstate Fill Style 1 : ĠBoolean Ġget () Ġ= Ġ(( states Ġand Ġ 0 x 0 4 ) Ġ!= Ġ 0 ) Ċ ĉ val Ġstate Fill Style 0 : ĠBoolean Ġget () Ġ= Ġ(( states Ġand Ġ 0 x 0 2 ) Ġ!= Ġ 0 ) Ċ ĉ val Ġstate MoveTo : ĠBoolean Ġget () Ġ= Ġ(( states Ġand Ġ 0 x 0 1 ) Ġ!= Ġ 0 ) ĊĊ ĉ override Ġval Ġtype Ġ= ĠSW F Shape Record . TYPE _ STYLE CHANGE ĊĊ ĉ override Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ if Ġ( state MoveTo ) Ġ{ Ċĉĉ ĉ val Ġmove Bits Ġ= Ġdata . read UB ( 5 ) Ċĉĉ ĉ move Delta X Ġ= Ġdata . read SB ( move Bits ) Ċĉĉ ĉ move Delta Y Ġ= Ġdata . read SB ( move Bits ) Ċĉ ĉ } Ċĉ ĉ fillStyle 0 Ġ= Ġif Ġ( state Fill Style 0 ) Ġdata . read UB ( num Fill Bits ) Ġelse Ġ 0 Ċĉ ĉ fillStyle 1 Ġ= Ġif Ġ( state Fill Style 1 ) Ġdata . read UB ( num Fill Bits ) Ġelse Ġ 0 Ċĉ ĉ line Style Ġ= Ġif Ġ( state Line Style ) Ġdata . read UB ( num Line Bits ) Ġelse Ġ 0 Ċĉ ĉ if Ġ( state New Styles ) Ġ{ Ċĉĉ ĉ data . reset Bits Pending () Ċĉĉ ĉ val Ġfill Styles Len : ĠInt Ġ= Ġread Style Array Length ( data , Ġlevel ) Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġfill Styles Len ) Ġ{ Ċĉĉĉ ĉ fill Styles . add ( data . read FILL STYLE ( level )) Ċĉĉ ĉ } Ċĉĉ ĉ val Ġline Styles Len : ĠInt Ġ= Ġread Style Array Length ( data , Ġlevel ) Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġline Styles Len ) Ġ{ Ċĉĉĉ ĉ line Styles . add ( if Ġ( level Ġ<= Ġ 3 ) Ġdata . read LINE STYLE ( level ) Ġelse Ġdata . read LINE STYLE 2 ( level )) Ċĉĉ ĉ } Ċĉĉ ĉ data . reset Bits Pending () Ċĉĉ ĉ num Fill Bits Ġ= Ġdata . read UB ( 4 ) Ċĉĉ ĉ num Line Bits Ġ= Ġdata . read UB ( 4 ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ protected Ġfun Ġread Style Array Length ( data : ĠSW F Data , Ġlevel : ĠInt Ġ= Ġ 1 ): ĠInt Ġ{ Ċĉ ĉ var Ġlen : ĠInt Ġ= Ġdata . read UI 8 () Ċĉ ĉ if Ġ( level Ġ>= Ġ 2 Ġ&& Ġlen Ġ== Ġ 0 xff ) Ġ{ Ċĉĉ ĉ len Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ } Ċĉ ĉ return Ġlen Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ val Ġindent Ġ= Ġ 0 Ċĉ ĉ var Ġstr Ġ= Ġ"[ SW F Shape Record Style Change ] Ġ" Ċĉ ĉ val Ġcmds Ġ= Ġarray ListOf < String >() Ċĉ ĉ if Ġ( state MoveTo ) Ġcmds . add (" MoveTo : Ġ$ move Delta X ,$ move Delta Y ") Ċĉ ĉ if Ġ( state Fill Style 0 ) Ġcmds . add (" Fill Style 0 : Ġ$ fillStyle 0 ") Ċĉ ĉ if Ġ( state Fill Style 1 ) Ġcmds . add (" Fill Style 1 : Ġ$ fillStyle 1 ") Ċĉ ĉ if Ġ( state Line Style ) Ġcmds . add (" Line Style : Ġ$ line Style ") Ċĉ ĉ if Ġ( cmds . size Ġ> Ġ 0 ) Ġstr Ġ+= Ġcmds . join ToString (", Ġ") Ċĉ ĉ if Ġ( state New Styles ) Ġ{ Ċĉĉ ĉ if Ġ( fill Styles . size Ġ> Ġ 0 ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ" New ĠFill Styles :" Ċĉĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġfill Styles . size ) Ġ{ Ċĉĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 4 ) Ġ+ Ġ"[" Ġ+ Ġ( i Ġ+ Ġ 1 ) Ġ+ Ġ"] Ġ" Ġ+ Ġfill Styles [ i ]. toString () Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( line Styles . size Ġ> Ġ 0 ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ" New ĠLine Styles :" Ċĉĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġline Styles . size ) Ġ{ Ċĉĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 4 ) Ġ+ Ġ"[" Ġ+ Ġ( i Ġ+ Ġ 1 ) Ġ+ Ġ"] Ġ" Ġ+ Ġline Styles [ i ]. toString () Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġstr Ċ ĉ } ĊĊ ĉ override Ġfun Ġclone (): ĠSW F Shape Record Ġ= Ġthis . copy () Ċ } Ċ Ċ class ĠSW F Shape With Style ( unit Div isor : ĠDouble Ġ= Ġ 2 0 . 0 ) Ġ: ĠSW F Shape ( unit Div isor ) Ġ{ Ċ ĉ var Ġinitial Fill Styles Ġ= ĠArrayList < SW FF ill Style >() Ċ ĉ var Ġinitial Line Styles Ġ= ĠArrayList < SW F Line Style >() ĊĊ ĉ override Ġfun Ġparse ( data : ĠSW F Data , Ġlevel : ĠInt ) Ġ{ Ċĉ ĉ data . reset Bits Pending () Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġread Style Array Length ( data , Ġlevel )) Ġinitial Fill Styles . add ( data . read FILL STYLE ( level )) Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġread Style Array Length ( data , Ġlevel )) Ġinitial Line Styles . add ( Ċĉĉ ĉ if Ġ( level Ġ<= Ġ 3 ) Ġdata . read LINE STYLE ( Ċĉĉĉ ĉ level Ċĉĉ ĉ ) Ġelse Ġdata . read LINE STYLE 2 ( level ) Ċĉ ĉ ) Ċĉ ĉ data . reset Bits Pending () Ċĉ ĉ val Ġnum Fill Bits : ĠInt Ġ= Ġdata . read UB ( 4 ) Ċĉ ĉ val Ġnum Line Bits : ĠInt Ġ= Ġdata . read UB ( 4 ) Ċĉ ĉ read Shape Records ( data , Ġnum Fill Bits , Ġnum Line Bits , Ġlevel ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġexport (_ handler : ĠShape Exporter ) Ġ{ Ċĉ ĉ fill Styles Ġ= ĠArrayList ( initial Fill Styles ) Ċĉ ĉ line Styles Ġ= ĠArrayList ( initial Line Styles ) Ċĉ ĉ super . export (_ handler ) Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString ( indent : ĠInt ): ĠString Ġ{ Ċĉ ĉ var Ġstr Ġ= Ġ"" Ċĉ ĉ if Ġ( initial Fill Styles . size Ġ> Ġ 0 ) Ġ{ Ċĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent ) Ġ+ Ġ" Fill Styles :" Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġinitial Fill Styles . size ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ"[" Ġ+ Ġ( i Ġ+ Ġ 1 ) Ġ+ Ġ"] Ġ" Ġ+ Ġinitial Fill Styles [ i ]. toString () Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ if Ġ( initial Line Styles . size Ġ> Ġ 0 ) Ġ{ Ċĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent ) Ġ+ Ġ" Line Styles :" Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġinitial Line Styles . size ) Ġ{ Ċĉĉĉ ĉ str Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ"[" Ġ+ Ġ( i Ġ+ Ġ 1 ) Ġ+ Ġ"] Ġ" Ġ+ Ġinitial Line Styles [ i ]. toString () Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġstr Ġ+ Ġsuper . toString ( indent ) Ċ ĉ } ĊĊ ĉ protected Ġfun Ġread Style Array Length ( data : ĠSW F Data , Ġlevel : ĠInt Ġ= Ġ 1 ): ĠInt Ġ{ Ċĉ ĉ var Ġlen : ĠInt Ġ= Ġdata . read UI 8 () Ċĉ ĉ if Ġ( level Ġ>= Ġ 2 Ġ&& Ġlen Ġ== Ġ 0 xff ) Ġlen Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ return Ġlen Ċ ĉ } Ċ } Ċ Ċ data Ġclass ĠSW FS ound Envelope ( Ċ ĉ var Ġpos 4 4 : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġleft Level : ĠInt Ġ= Ġ 0 , Ċ ĉ var Ġright Level : ĠInt Ġ= Ġ 0 Ċ ) Ġ{ Ċ ĉ constructor ( data : ĠSW F Data ) Ġ: Ġthis ( data . read UI 3 2 (), Ġdata . read UI 1 6 (), Ġdata . read UI 1 6 ()) Ċ } Ċ Ċ class ĠSW FS ound Info Ġ{ Ċ ĉ var Ġsync Stop : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġsync No Multiple : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġhas Envelope : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġhas Lo ops : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġhas Out Point : ĠBoolean Ġ= Ġfalse Ċ ĉ var Ġhas In Point : ĠBoolean Ġ= Ġfalse ĊĊ ĉ var Ġout Point : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġin Point : ĠInt Ġ= Ġ 0 Ċ ĉ var Ġloop Count : ĠInt Ġ= Ġ 0 ĊĊ ĉ var Ġenvelope Records Ġ= ĠArrayList < SW FS ound Envelope >() ĊĊ ĉ fun Ġparse ( data : ĠSW F Data ) Ġ{ Ċĉ ĉ val Ġflags Ġ= Ġdata . read UI 8 () Ċĉ ĉ sync Stop Ġ= Ġ(( flags Ġand Ġ 0 x 2 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ sync No Multiple Ġ= Ġ(( flags Ġand Ġ 0 x 1 0 ) Ġ!= Ġ 0 ) Ċĉ ĉ has Envelope Ġ= Ġ(( flags Ġand Ġ 0 x 0 8 ) Ġ!= Ġ 0 ) Ċĉ ĉ has Lo ops Ġ= Ġ(( flags Ġand Ġ 0 x 0 4 ) Ġ!= Ġ 0 ) Ċĉ ĉ has Out Point Ġ= Ġ(( flags Ġand Ġ 0 x 0 2 ) Ġ!= Ġ 0 ) Ċĉ ĉ has In Point Ġ= Ġ(( flags Ġand Ġ 0 x 0 1 ) Ġ!= Ġ 0 ) Ċĉ ĉ if Ġ( has In Point ) Ġin Point Ġ= Ġdata . read UI 3 2 () Ċĉ ĉ if Ġ( has Out Point ) Ġout Point Ġ= Ġdata . read UI 3 2 () Ċĉ ĉ if Ġ( has Lo ops ) Ġloop Count Ġ= Ġdata . read UI 1 6 () Ċĉ ĉ if Ġ( has Envelope ) Ġ{ Ċĉĉ ĉ val Ġenv Points : ĠInt Ġ= Ġdata . read UI 8 () Ċĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġenv Points ) Ġenvelope Records . add ( data . read SOUND EN VELO PE ()) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ= Ġ"[ SW FS ound Info ]" Ċ } Ċ Ċ data Ġclass ĠSW F Symbol ( var Ġtag Id : ĠInt Ġ= Ġ 0 , Ġvar Ġname : ĠString ? Ġ= Ġnull ) Ġ{ Ċ ĉ constructor ( data : ĠSW F Data ) Ġ: Ġthis ( data . read UI 1 6 (), Ġdata . readString ()) Ċ } Ċ Ċ class ĠSW F Text Record Ġ{ Ċ ĉ var Ġtype Ġ= Ġ 0 Ċ ĉ var Ġhas Font Ġ= Ġfalse Ċ ĉ var Ġhas Color Ġ= Ġfalse Ċ ĉ var Ġhas X Offset Ġ= Ġfalse Ċ ĉ var Ġhas Y Offset Ġ= Ġfalse ĊĊ ĉ var Ġfont Id Ġ= Ġ 0 Ċ ĉ var ĠtextColor Ġ= Ġ 0 Ċ ĉ var Ġtext Height Ġ= Ġ 0 Ċ ĉ var Ġx Offset Ġ= Ġ 0 Ċ ĉ var Ġy Offset Ġ= Ġ 0 ĊĊ ĉ var Ġglyph Entries Ġ= ĠArrayList < SW FG lyph Entry >() ĊĊ ĉ protected Ġvar Ġ_ level Ġ= Ġ 0 ĊĊ ĉ fun Ġparse ( Ċĉ ĉ data : ĠSW F Data , Ċĉ ĉ glyph Bits : ĠInt , Ċĉ ĉ advance Bits : ĠInt , Ċĉ ĉ previous Record : ĠSW F Text Record ? Ġ= Ġnull , Ċĉ ĉ level : ĠInt Ġ= Ġ 1 Ċ ĉ ) Ġ{ Ċĉ ĉ _ level Ġ= Ġlevel Ċĉ ĉ val Ġstyles : ĠInt Ġ= Ġdata . read UI 8 () Ċĉ ĉ type Ġ= Ġstyles Ġ ush r Ġ 7 Ċĉ ĉ has Font Ġ= Ġ(( styles Ġand Ġ 0 x 0 8 ) Ġ!= Ġ 0 ) Ċĉ ĉ has Color Ġ= Ġ(( styles Ġand Ġ 0 x 0 4 ) Ġ!= Ġ 0 ) Ċĉ ĉ has Y Offset Ġ= Ġ(( styles Ġand Ġ 0 x 0 2 ) Ġ!= Ġ 0 ) Ċĉ ĉ has X Offset Ġ= Ġ(( styles Ġand Ġ 0 x 0 1 ) Ġ!= Ġ 0 ) Ċĉ ĉ font Id Ġ= Ġif Ġ( has Font ) Ġdata . read UI 1 6 () Ġelse Ġprevious Record ?. font Id Ġ?: Ġfont Id Ċĉ ĉ textColor Ġ= Ġif Ġ( has Color ) Ġ( if Ġ( level Ġ< Ġ 2 ) Ġdata . read RGB () Ġelse Ġdata . read RGBA ()) Ġelse Ġprevious Record ?. textColor Ċĉĉĉ ĉ ?: ĠtextColor Ċĉ ĉ x Offset Ġ= Ġif Ġ( has X Offset ) Ġdata . read SI 1 6 () Ġelse Ġprevious Record ?. x Offset Ġ?: Ġx Offset Ċĉ ĉ y Offset Ġ= Ġif Ġ( has Y Offset ) Ġdata . read SI 1 6 () Ġelse Ġprevious Record ?. y Offset Ġ?: Ġy Offset Ċĉ ĉ text Height Ġ= Ġif Ġ( has Font ) Ġdata . read UI 1 6 () Ġelse Ġprevious Record ?. text Height Ġ?: Ġtext Height Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġdata . read UI 8 ()) Ġglyph Entries . add ( data . read GL YP HEN TRY ( glyph Bits , Ġadvance Bits )) Ċ ĉ } ĊĊ ĉ fun ĠtoString ( indent : ĠInt Ġ= Ġ 0 ): ĠString Ġ{ Ċĉ ĉ val Ġparams Ġ= Ġarray ListOf (" Glyph s : Ġ" Ġ+ Ġglyph Entries . size . toString ()) Ċĉ ĉ if Ġ( has Font ) Ġparams . add (" Font ID : Ġ$ font Id "); Ġparams . add (" Height : Ġ$ text Height ") Ċĉ ĉ if Ġ( has Color ) Ġparams . add ( Ċĉĉ ĉ " Color : Ġ" Ġ+ Ġ( if Ġ(_ level Ġ<= Ġ 2 ) ĠColor Utils . rgb ToString ( textColor ) Ġelse ĠColor Utils . rgba ToString ( Ċĉĉĉ ĉ textColor Ċĉĉ ĉ )) Ċĉ ĉ ) Ċĉ ĉ if Ġ( has X Offset ) Ġparams . add (" X Offset : Ġ$ x Offset ") Ċĉ ĉ if Ġ( has Y Offset ) Ġparams . add (" Y Offset : Ġ$ y Offset ") Ċĉ ĉ var Ġstr : ĠString Ġ= Ġparams . join ToString (", Ġ") Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġglyph Entries . size ) Ġstr Ġ+= Ġ"\ n " Ġ+ Ġ" Ġ". repeat ( indent Ġ+ Ġ 2 ) Ġ+ Ġ"[" Ġ+ Ġi Ġ+ Ġ"] Ġ" Ġ+ Ġglyph Entries [ i ]. toString () Ċĉ ĉ return Ġstr Ċ ĉ } Ċ } Ċ Ċ data Ġclass ĠSW F Zone Data ( var Ġalignment Coordinate : ĠDouble , Ġvar Ġrange : ĠDouble ) Ġ{ Ċ ĉ constructor ( data : ĠSW F Data ) Ġ: Ġthis ( data . read FLOAT 1 6 (), Ġdata . read FLOAT 1 6 ()) Ċ } Ċ Ċ class ĠSW F Zone Record ( var Ġzone Data : ĠList < SW F Zone Data >, Ġvar Ġmask : ĠInt ) Ġ{ Ċ ĉ val Ġmask X : ĠBoolean Ġget () Ġ= Ġ(( mask Ġand Ġ 0 x 0 1 ) Ġ!= Ġ 0 ) Ċ ĉ val Ġmask Y : ĠBoolean Ġget () Ġ= Ġ(( mask Ġand Ġ 0 x 0 2 ) Ġ!= Ġ 0 ) ĊĊ ĉ constructor ( data : ĠSW F Data ) Ġ: Ġthis ( Ċĉ ĉ ( 0 Ġuntil Ġdata . read UI 8 ()). map Ġ{ Ġdata . read Z ON ED ATA () Ġ}, Ċĉ ĉ data . read UI 8 () Ċ ĉ ) Ċ } Ċ Ċ enum Ġclass ĠGradient Type Ġ{ ĠLINE AR , ĠRAD IAL Ġ} Ċ