/* Ċ ĠCopyright Ġ 2 0 2 1 ĠSpl endo ĠConsult ing ĠB . V . ĠThe ĠNe therlands ĊĊĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); ĊĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĊĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat ĊĊĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 ĊĊĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware ĊĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĊĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĊĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand ĊĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . ĊĊ Ġ*/ Ċ Ċ package Ġcom . spl endo . kal uga . resources Ċ Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* ĠBlend ĠMode s Ġas Ġdefined Ġby Ġhttps :// www . adobe . com / content / dam / ac om / en / dev net / pdf / pdf _ reference _ archive / blend _ modes . pdf Ċ Ġ*/ Ċ sealed Ġclass ĠBlend Mode Ġ{ ĊĊĠĠĠ Ġabstract Ġfun Ġblend Color ( backdrop : ĠColor , Ġsource : ĠColor ): ĠColor ĊĊĠĠĠ Ġsealed Ġclass ĠSepar able Blend Mode Ġ: ĠBlend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color ( backdrop : ĠColor , Ġsource : ĠColor ): ĠColor Ġ= Ġcolor From ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblend Color Channel ( backdrop . red , Ġsource . red ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblend Color Channel ( backdrop . green , Ġsource . green ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblend Color Channel ( backdrop . blue , Ġsource . blue ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠNon Separ able Blend Mode Ġ: ĠBlend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġprotected Ġdata Ġclass ĠUn bound Color ( val Ġred : ĠDouble , Ġval Ġblue : ĠDouble , Ġval Ġgreen : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl um ination : ĠDouble Ġget () Ġ= Ġ 0 . 3 Ġ* Ġred Ġ+ Ġ 0 . 5 9 Ġ* Ġgreen Ġ+ Ġ 0 . 1 1 Ġ* Ġblue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġset L um ination ( lum ination : ĠDouble ): ĠUn bound Color Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġl um ination Ġ- Ġthis . lum ination ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUn bound Color ( red Ġ+ Ġdelta , Ġgreen Ġ+ Ġdelta , Ġblue Ġ+ Ġdelta ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclip : ĠColor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl um ination Ġ= Ġthis . lum ination ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġmin Of ( red , Ġgreen , Ġblue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġmax Of ( red , Ġgreen , Ġblue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ< Ġ 0 . 0 Ġ-> Ġcolor From ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl um ination Ġ+ Ġ((( red Ġ- Ġl um ination ) Ġ* Ġl um ination ) Ġ/ Ġ( lum ination Ġ- Ġmin )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl um ination Ġ+ Ġ((( green Ġ- Ġl um ination ) Ġ* Ġl um ination ) Ġ/ Ġ( lum ination Ġ- Ġmin )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl um ination Ġ+ Ġ((( blue Ġ- Ġl um ination ) Ġ* Ġl um ination ) Ġ/ Ġ( lum ination Ġ- Ġmin )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ> Ġ 1 . 0 Ġ-> Ġcolor From ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl um ination Ġ+ Ġ((( red Ġ- Ġl um ination ) Ġ* Ġ( 1 . 0 Ġ- Ġl um ination )) Ġ/ Ġ( max Ġ- Ġl um ination )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl um ination Ġ+ Ġ((( green Ġ- Ġl um ination ) Ġ* Ġ( 1 . 0 Ġ- Ġl um ination )) Ġ/ Ġ( max Ġ- Ġl um ination )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl um ination Ġ+ Ġ((( blue Ġ- Ġl um ination ) Ġ* Ġ( 1 . 0 Ġ- Ġl um ination )) Ġ/ Ġ( max Ġ- Ġl um ination )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcolor From ( red , Ġgreen , Ġblue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠColor . un bounded Ġget () Ġ= ĠUn bound Color ( red , Ġgreen , Ġblue ) ĊĠĠĠĠĠĠĠ Ġprotected Ġval ĠColor . lum ination Ġget () Ġ= Ġun bounded . lum ination ĊĠĠĠĠĠĠĠ Ġprotected Ġval ĠColor . sat uration : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġmax Of ( red , Ġgreen , Ġblue ) Ġ- Ġmin Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġred , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgreen , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun ĠColor . set L um ination ( lum ination : ĠDouble ): ĠColor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun bounded . set L um ination ( lum ination ). clip ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun ĠColor . set Sat uration ( sat uration : ĠDouble ): ĠColor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Red Ġ= Ġ" red " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Green Ġ= Ġ" green " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Blue Ġ= Ġ" blue " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannels Ġ= Ġmap Of ( key Red Ġto Ġred , Ġkey Green Ġto Ġgreen , Ġkey Blue Ġto Ġblue ). toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . second Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( channels [ 2 ]. second Ġ> Ġchannels [ 0 ]. second ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Middle Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ((( channels [ 1 ]. second Ġ- Ġchannels [ 0 ]. second ) Ġ* Ġsat uration ) Ġ/ Ġ( channels [ 2 ]. second Ġ- Ġchannels [ 0 ]. second )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannels [ 1 ] Ġ= Ġchannels [ 1 ]. copy ( second Ġ= Ġnew Middle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannels [ 2 ] Ġ= Ġchannels [ 2 ]. copy ( second Ġ= Ġsat uration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannels [ 1 ] Ġ= Ġchannels [ 1 ]. copy ( second Ġ= Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannels [ 2 ] Ġ= Ġchannels [ 2 ]. copy ( second Ġ= Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannels [ 0 ] Ġ= Ġchannels [ 0 ]. copy ( second Ġ= Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannels Map Ġ= Ġchannels . toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcolor From ( channels Map [ key Red ] !! , Ġchannels Map [ key Green ] !! , Ġchannels Map [ key Blue ] !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠNormal Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ= Ġsource ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠMultiply Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ= Ġback drop Ġ* Ġsource ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠScreen Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback drop Ġ+ Ġsource Ġ- Ġback drop Ġ* Ġsource ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠOverlay Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHard Light . blend Color Channel ( source , Ġback drop ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠDar ken Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin ( backdrop , Ġsource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠLight en Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax ( backdrop , Ġsource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠHard Light Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( source Ġ<= Ġ 0 . 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMultiply . blend Color Channel ( backdrop , Ġ 2 . 0 Ġ* Ġsource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScreen . blend Color Channel ( backdrop , Ġ 2 . 0 Ġ* Ġsource Ġ- Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠSoft Light Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( source Ġ<= Ġ 0 . 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback drop Ġ- Ġ( 1 . 0 Ġ- Ġ 2 . 0 Ġ* Ġsource ) Ġ* Ġback drop Ġ* Ġ( 1 . 0 Ġ- Ġback drop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback drop Ġ+ Ġ( 2 . 0 Ġ* Ġsource Ġ- Ġ 1 . 0 ) Ġ* Ġif Ġ( backdrop Ġ<= Ġ 0 . 2 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( 1 6 . 0 Ġ* Ġback drop Ġ- Ġ 1 2 . 0 ) Ġ* Ġback drop Ġ+ Ġ 4 . 0 ) Ġ* Ġback drop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsqrt ( backdrop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠColor Dod ge Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback drop Ġ== Ġ 0 . 0 Ġ-> Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ== Ġ 1 . 0 Ġ-> Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmin ( 1 . 0 , Ġback drop Ġ/ Ġ( 1 . 0 Ġ- Ġsource )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠColor Burn Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback drop Ġ== Ġ 1 . 0 Ġ-> Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ== Ġ 0 . 0 Ġ-> Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 . 0 Ġ- Ġmin ( 1 . 0 , Ġ( 1 . 0 Ġ- Ġback drop ) Ġ/ Ġsource ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠD ifference Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( backdrop Ġ- Ġsource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠEx clusion Ġ: ĠSepar able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color Channel ( backdrop : ĠDouble , Ġsource : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġback drop Ġ+ Ġsource Ġ- Ġ 2 . 0 Ġ* Ġback drop Ġ* Ġsource ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠH ue Ġ: ĠNon Separ able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color ( backdrop : ĠColor , Ġsource : ĠColor ): ĠColor Ġ= Ġsource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sat uration ( backdrop . sat uration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set L um ination ( backdrop . lum ination ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠSat uration Ġ: ĠNon Separ able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color ( backdrop : ĠColor , Ġsource : ĠColor ): ĠColor Ġ= Ġback drop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sat uration ( source . sat uration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set L um ination ( backdrop . lum ination ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠColor Blend Ġ: ĠNon Separ able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color ( backdrop : ĠColor , Ġsource : ĠColor ): ĠColor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . set L um ination ( backdrop . lum ination ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠL umin osity Ġ: ĠNon Separ able Blend Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġblend Color ( backdrop : ĠColor , Ġsource : ĠColor ): ĠColor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback drop . set L um ination ( source . lum ination ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠBl ends Ġtwo Ġcolors Ġaccording Ġto Ġtheir Ġ[ Blend Mode ] Ċ Ġ* ĠFor ĠAlpha ĠBl ending Ġthe ĠW 3 Ġstandard Ġis Ġapplied : Ġhttps :// www . w 3 . org / TR / comp osit ing - 1 /# bl ending Ċ Ġ*/ Ċ private Ġfun ĠColor . blend ( source : ĠColor , Ġmode : ĠBlend Mode ): ĠColor Ġ{ ĊĠĠĠ Ġval Ġalpha Compose Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġback drop Alpha : ĠDouble , ĊĠĠĠĠĠĠĠ Ġsource Alpha : ĠDouble , ĊĠĠĠĠĠĠĠ Ġcomposite Alpha : ĠDouble , ĊĠĠĠĠĠĠĠ Ġback drop Color : ĠDouble , ĊĠĠĠĠĠĠĠ Ġsource Color : ĠDouble , ĊĠĠĠĠĠĠĠ Ġcomposite Color : ĠDouble Ġ-> ĊĠĠĠĠĠĠĠ ĠDouble ĊĠĠĠĠĠĠĠ Ġ( 1 . 0 Ġ- Ġsource Alpha Ġ/ Ġcomposite Alpha ) Ġ* Ġback drop Color Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( source Alpha Ġ/ Ġcomposite Alpha ) Ġ* Ġ(( 1 Ġ- Ġback drop Alpha ) Ġ* Ġsource Color Ġ+ Ġback drop Alpha Ġ* Ġcomposite Color ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcomposite Ġ= Ġmode . blend Color ( this , Ġsource ) ĊĠĠĠ Ġval Ġcomposite Alpha Ġ= Ġsource . alpha Ġ+ Ġalpha Ġ- Ġ( source . alpha Ġ* Ġalpha ) ĊĠĠĠ Ġreturn Ġcolor From ( ĊĠĠĠĠĠĠĠ Ġalpha Compose ( alpha , Ġsource . alpha , Ġcomposite Alpha , Ġred , Ġsource . red , Ġcomposite . red ), ĊĠĠĠĠĠĠĠ Ġalpha Compose ( alpha , Ġsource . alpha , Ġcomposite Alpha , Ġgreen , Ġsource . green , Ġcomposite . green ), ĊĠĠĠĠĠĠĠ Ġalpha Compose ( alpha , Ġsource . alpha , Ġcomposite Alpha , Ġblue , Ġsource . blue , Ġcomposite . blue ), ĊĠĠĠĠĠĠĠ Ġcomposite Alpha ĊĠĠĠ Ġ) Ċ } Ċ Ċ infix Ġfun ĠColor . normal ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Normal ) Ċ infix Ġfun ĠColor . multiply ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Multiply ) Ċ infix Ġfun ĠColor . screen ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Screen ) Ċ infix Ġfun ĠColor . overlay ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Overlay ) Ċ infix Ġfun ĠColor . dar ken ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Dar ken ) Ċ infix Ġfun ĠColor . light en ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Light en ) Ċ infix Ġfun ĠColor . hard Light ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Hard Light ) Ċ infix Ġfun ĠColor . soft Light ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Soft Light ) Ċ infix Ġfun ĠColor . dod ge ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Color Dod ge ) Ċ infix Ġfun ĠColor . burn ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Color Burn ) Ċ infix Ġfun ĠColor . difference ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Difference ) Ċ infix Ġfun ĠColor . exclude ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Ex clusion ) Ċ infix Ġfun ĠColor . hue ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Hue ) Ċ infix Ġfun ĠColor . s atur ate ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Sat uration ) Ċ infix Ġfun ĠColor . lum inate ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . L umin osity ) Ċ infix Ġfun ĠColor . color Blend ( source : ĠColor ) Ġ= Ġblend ( source , ĠBlend Mode . Color Blend ) Ċ