package Ġorg . open rnd r . extra . shade styles Ċ Ċ import Ġorg . open rnd r . color . Algebra ic Color Ċ import Ġorg . open rnd r . color . Color RGB a Ċ import Ġorg . open rnd r . color . Convert ible To Color RGB a Ċ import Ġorg . open rnd r . draw . Shade Style Ċ import Ġorg . open rnd r . extra . parameters . Description Ċ import Ġorg . open rnd r . extra . color . spaces . Color OK LAB a Ċ import Ġorg . open rnd r . math . Cast able To Vector 4 Ċ import Ġorg . open rnd r . math . Vector 2 Ċ Ċ @ Description (" Mult icol or Ġlinear Ġgradient ") Ċ open Ġclass ĠN Point Linear Gradient Base < C >( ĊĠĠĠ Ġcolors : ĠArray < C >, ĊĠĠĠ Ġpoints : ĠArray < Double > Ġ= ĠArray ( colors . size ) Ġ{ Ġit Ġ/ Ġ( colors . size Ġ- Ġ 1 . 0 ) Ġ}, ĊĠĠĠ Ġoffset : ĠVector 2 Ġ= ĠVector 2 . ZERO , ĊĠĠĠ Ġrotation : ĠDouble Ġ= Ġ 0 . 0 Ċ ) Ġ: ĠSh ade Style () ĊĠĠĠĠĠĠĠ Ġwhere ĠC Ġ: ĠConvert ible To Color RGB a , ĠC Ġ: ĠAl gebra ic Color < C >, ĠC Ġ: ĠCast able To Vector 4 Ġ{ ĊĊĠĠĠ Ġvar Ġcolors : ĠArray < C > Ġby ĠParameter () ĊĊĠĠĠ Ġ// ĠSorted Ġnormalized Ġvalues Ġdefining Ġrelative Ġpositions Ġof Ġcolors ĊĠĠĠ Ġvar Ġpoints : ĠArray < Double > Ġby ĠParameter () ĊĠĠĠ Ġvar Ġoffset : ĠVector 2 Ġby ĠParameter () ĊĠĠĠ Ġvar Ġrotation : ĠDouble Ġby ĠParameter () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . colors Ġ= Ġcolors ĊĠĠĠĠĠĠĠ Ġthis . points Ġ= Ġpoints ĊĠĠĠĠĠĠĠ Ġthis . offset Ġ= Ġoffset ĊĠĠĠĠĠĠĠ Ġthis . rotation Ġ= Ġrotation ĊĊĠĠĠĠĠĠĠ Ġfragment Transform Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvec 2 Ġcoord Ġ= Ġ( c _ bounds Position . xy Ġ- Ġ 0 . 5 Ġ+ Ġp _ offset ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloat Ġcr Ġ= Ġcos ( radians ( p _ rotation )); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloat Ġsr Ġ= Ġsin ( radians ( p _ rotation )); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmat 2 Ġrm Ġ= Ġmat 2 ( cr , Ġ- sr , Ġsr , Ġcr ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvec 2 Ġrc Ġ= Ġrm Ġ* Ġcoord ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloat Ġf Ġ= Ġclamp ( rc . y Ġ+ Ġ 0 . 5 , Ġ 0 . 0 , Ġ 1 . 0 ); ĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġi = 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( i Ġ< Ġp _ points _ SIZE Ġ- Ġ 1 Ġ&& Ġf Ġ>= Ġp _ points [ i + 1 ]) Ġ{ Ġi ++; Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġvec 4 Ġcolor 0 Ġ= Ġp _ colors [ i ]; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvec 4 Ġcolor 1 Ġ= Ġp _ colors [ i + 1 ]; Ġ ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloat Ġg Ġ= Ġ( f Ġ- Ġp _ points [ i ]) Ġ/ Ġ( p _ points [ i + 1 ] Ġ- Ġp _ points [ i ]); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvec 4 Ġgradient Ġ= Ġmix ( color 0 , Ġcolor 1 , Ġclamp ( g , Ġ 0 . 0 , Ġ 1 . 0 )); Ġ ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ${ generate Color Transform ( colors [ 0 ]:: class )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġx _ fill Ġ*= Ġgradient ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x _ fill . a Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx _ fill . rgb Ġ/= Ġx _ fill . a ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠN Point Linear Gradient ( ĊĠĠĠ Ġcolors : ĠArray < Color RGB a >, ĊĠĠĠ Ġpoints : ĠArray < Double > Ġ= ĠArray ( colors . size ) Ġ{ Ġit Ġ/ Ġ( colors . size Ġ- Ġ 1 . 0 ) Ġ}, ĊĠĠĠ Ġoffset : ĠVector 2 Ġ= ĠVector 2 . ZERO , ĊĠĠĠ Ġrotation : ĠDouble Ġ= Ġ 0 . 0 Ċ ) Ġ: ĠN Point Linear Gradient Base < Color RGB a >( colors , Ġpoints , Ġoffset , Ġrotation ) Ċ Ċ class ĠN Point Linear Gradient OK Lab ( ĊĠĠĠ Ġcolors : ĠArray < Color OK LAB a >, ĊĠĠĠ Ġpoints : ĠArray < Double > Ġ= ĠArray ( colors . size ) Ġ{ Ġit Ġ/ Ġ( colors . size Ġ- Ġ 1 . 0 ) Ġ}, ĊĠĠĠ Ġoffset : ĠVector 2 Ġ= ĠVector 2 . ZERO , ĊĠĠĠ Ġrotation : ĠDouble Ġ= Ġ 0 . 0 Ċ ) Ġ: ĠN Point Linear Gradient Base < Color OK LAB a >( colors , Ġpoints , Ġoffset , Ġrotation ) ĊĊĊ